fseek, _fseeki64
Déplace le pointeur de fichier vers un emplacement spécifié.
int fseek(
FILE *stream,
long offset,
int origin
);
int _fseeki64(
FILE *stream,
__int64 offset,
int origin
);
Paramètres
stream
Pointeur vers la structure FILE.offset
Nombre d'octets de origin.origin
Position initiale.
Valeur de retour
En cas de succès fseek et _fseeki64 retourne 0. Sinon, il retourne une valeur différente de zéro. Sur des périphériques incapables d'effectuer des recherches, la valeur de retour n'est pas définie. Si stream est un pointeur null, ou si origin n'est pas l'une des valeurs autorisées décrites ci-dessous, fseek et _fseeki64 appelle le gestionnaire de paramètre non valide, comme décrit dans Validation de paramètre. Si l'exécution est autorisée à se poursuivre, ces fonctions définissent errno avec la valeur EINVAL et retournent -1.
Notes
Les fonctionsfseek et _fseeki64 déplacent le pointeur de fichier (s'il existe) associé à stream vers un nouvel emplacement qui est décalé deoffset octets par rapport à l'origin*.* L'opération suivante dans le flux de donnée prend place dans le nouvel emplacement. Dans un flux ouvert pour la mise à jour, l'opération suivante peut être soit une lecture soit ou une écriture. L'origine de l'argument doit etre l'une des constantes suivantes, définies dans STDIO.H :
SEEK_CUR
Position actuelle du pointeur de fichier.SEEK_END
Fin du fichier.SEEK_SET
Début du fichier.
Vous pouvez utiliser fseek et _fseeki64 pour repositionner le pointeur n'importe ou dans un fichier. Le pointeur peut également être placé au delà de la fin du fichier. fseek et _fseeki64nettoie l'indicateur de fin de fichier et inverse le résultat de tous les appels antérieurs ungetc sur stream.
Lorsqu'un fichier est ouvert pour ajouter des données, la position actuelle du fichier est déterminée par la dernière opération d'E/S, et non par lorsque l'écriture suivante se produirait. Si aucune opération d'E/S ne s'est produite dans un fichier ouvert pour l'ajout, la position de fichier correspond au début du fichier.
Pour les flux de données ouverts en mode texte, fseek et _fseeki64ont une utilisation limitée, car les traductions de saut de ligne-retour de chariot peuvent faire quefseek et _fseeki64produisent des résultats inattendus. Les seules opérationsfseek et _fseeki64, qui sont assurées d'utiliser des flux de données ouverts en mode texte sont :
Recherchant un décalage de 0 par rapport à n'importe laquelle des valeurs d'origine.
Recherchant du début du fichier avec une valeur de décalage retournée par un appel à ftell en utilisant fseekou _ftelli64en utilisant_fseeki64.
Dans le mode texte, CTRL+Z est interprété comme un caractère de fin de fichier en entrée. Dans les fichiers ouverts pour lecture/écriture fopenet toutes les autres routines vérifient la présence de Ctrl+Z à la fin du fichier et le supprime si possible. Cette opération est effectuée car l'utilisation de la combinaison de fseek et de ftellou_fseeki64 et _ftelli64, pour se déplacer à l'intérieur d'un fichier , qui se termine par un CTRL+Z peut agir surfseek ou_fseeki64et provoquer leur comportement de manière inappropriée près de la fin du fichier.
Lorsque le CRT ouvre un fichier qui commence par une marque d'ordre d'octet (BOM), dle pointeur du fichier est positionné après le BOM (qui est, au commencement du vrai contenu d'un fichier) Si vous devez fseek au début du fichier, utilisez ftell pour obtenir la position initiale et fseekle plutôt que pour la position 0.
Cette fonction verrouille d'autres threads pendant l'exécution et est par conséquent thread-safe. Pour une version non verrouillante, consultez _fseek_nolock, _fseeki64_nolock.
Configuration requise
Fonction |
En-tête requis |
---|---|
fseek |
<stdio.h> |
_fseeki64 |
<stdio.h> |
Pour plus d'informations sur la compatibilité, consultez Compatibilité dans l'introduction.
Exemple
// crt_fseek.c
// This program opens the file FSEEK.OUT and
// moves the pointer to the file's beginning.
#include <stdio.h>
int main( void )
{
FILE *stream;
char line[81];
int result;
if ( fopen_s( &stream, "fseek.out", "w+" ) != 0 )
{
printf( "The file fseek.out was not opened\n" );
return -1;
}
fprintf( stream, "The fseek begins here: "
"This is the file 'fseek.out'.\n" );
result = fseek( stream, 23L, SEEK_SET);
if( result )
perror( "Fseek failed" );
else
{
printf( "File pointer is set to middle of first line.\n" );
fgets( line, 80, stream );
printf( "%s", line );
}
fclose( stream );
}