Namespaces
Variants

fseek

From cppreference.net
< c ‎ | io
Défini dans l'en-tête <stdio.h>
int fseek ( FILE * stream, long offset, int origin ) ;
#define SEEK_SET    /* unspecified */

#define SEEK_CUR    /* unspecified */

#define SEEK_END    /* unspecified */

Définit l'indicateur de position du fichier pour le flux de fichier stream à la valeur pointée par offset .

Si le stream est ouvert en mode binaire, la nouvelle position est exactement offset octets mesurés depuis le début du fichier si origin est SEEK_SET , depuis la position actuelle du fichier si origin est SEEK_CUR , et depuis la fin du fichier si origin est SEEK_END . Les flux binaires ne sont pas tenus de supporter SEEK_END , en particulier si des octets nuls supplémentaires sont émis.

Si le stream est ouvert en mode texte, les seules valeurs prises en charge pour offset sont zéro (qui fonctionne avec n'importe quelle origin ) et une valeur renvoyée par un appel antérieur à ftell sur un flux associé au même fichier (qui ne fonctionne qu'avec origin de SEEK_SET ).

Si le stream est orienté large, les restrictions des flux texte et binaire s'appliquent (le résultat de ftell est autorisé avec SEEK_SET et un décalage nul est autorisé depuis SEEK_SET et SEEK_CUR , mais pas SEEK_END ).

En plus de modifier l'indicateur de position du fichier, fseek annule les effets de ungetc et efface le statut de fin de fichier, le cas échéant.

Si une erreur de lecture ou d'écriture se produit, l'indicateur d'erreur pour le flux ( ferror ) est défini et la position du fichier n'est pas affectée.

Table des matières

Paramètres

stream - flux de fichier à modifier
offset - nombre de caractères pour décaler la position relative à l'origine
origin - position à laquelle offset est ajouté. Peut avoir l'une des valeurs suivantes : SEEK_SET , SEEK_CUR , SEEK_END

Valeur de retour

0 en cas de succès, valeur non nulle sinon.

Notes

Après s'être positionné à une position non finale dans un flux large, le prochain appel à toute fonction de sortie peut rendre le reste du fichier indéfini, par exemple en produisant une séquence multioctet de longueur différente.

Pour les flux de texte, les seules valeurs valides de offset sont 0 (applicable à n'importe quelle origin ) et une valeur retournée par un appel antérieur à ftell (uniquement applicable à SEEK_SET ).

POSIX permet de se positionner au-delà de la fin existante du fichier. Si une opération d'écriture est effectuée après ce positionnement, toute lecture de l'intervalle renverra des octets nuls. Lorsque cela est pris en charge par le système de fichiers, cela crée un fichier sparse .

POSIX exige également que fseek effectue d'abord un fflush s'il y a des données non écrites (mais le rétablissement de l'état de décalage est défini par l'implémentation).

POSIX spécifie que fseek doit renvoyer - 1 en cas d'erreur, et définir errno pour indiquer l'erreur.

Sur Windows, _fseeki64 peut être utilisé pour travailler avec des fichiers de plus de 2 Gio.

Exemple

fseek avec vérification d'erreur :

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    // Préparer un tableau de valeurs doubles.
    #define SIZE 5
    double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0};
    // Écrire le tableau dans un fichier.
    FILE * fp = fopen("test.bin", "wb");
    fwrite(A, sizeof(double), SIZE, fp);
    fclose (fp);
    // Lire les valeurs doubles dans le tableau B.
    double B[SIZE];
    fp = fopen("test.bin", "rb");
    // Positionner l'indicateur de position du fichier devant la troisième valeur double.
    if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0)
    {
        fprintf(stderr, "fseek() failed in file %s at line # %d\n",
                __FILE__, __LINE__ - 2);
        fclose(fp);
        return EXIT_FAILURE;
    }
    int ret_code = fread(B, sizeof(double), 1, fp); // lit une valeur double
    printf("ret_code == %d\n", ret_code);           // affiche le nombre de valeurs lues
    printf("B[0] == %.1f\n", B[0]);                 // affiche une valeur
    fclose(fp);
    return EXIT_SUCCESS;
}

Sortie possible :

ret_code == 1
B[0] == 3.0

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.23.9.2 La fonction fseek (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.21.9.2 La fonction fseek (p : 245)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.21.9.2 La fonction fseek (p: 336-337)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.19.9.2 La fonction fseek (p : 302-303)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 4.9.9.2 La fonction fseek

Voir aussi

déplace l'indicateur de position du fichier vers un emplacement spécifique dans un fichier
(fonction)
obtient l'indicateur de position du fichier
(fonction)
retourne l'indicateur de position actuel du fichier
(fonction)
déplace l'indicateur de position du fichier vers le début d'un fichier
(fonction)