Namespaces
Variants

std:: fseek

From cppreference.net
< cpp ‎ | io ‎ | c
Défini dans l'en-tête <cstdio>
int fseek ( std:: FILE * stream, long offset, int origin ) ;

Définit l'indicateur de position du fichier pour le flux de fichier stream .

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 courante 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 produits.

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 retournée par un appel antérieur à std::ftell sur un flux associé au même fichier (qui fonctionne uniquement avec origin de SEEK_SET ).

Si le stream est orienté large, les restrictions des flux texte et binaire s'appliquent (le résultat de std::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 std::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 du flux ( std::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 par rapport à 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.

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'espace vide 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). Les flux de fichiers standard C++ garantissent à la fois le vidage et le rétablissement : std::basic_filebuf::seekoff .

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

#include <cassert>
#include <cstdio>
#include <cstdint>
#include <fstream>
#include <vector>
int main()
{
    std::ofstream("dummy.nfo") << "8 bytes\n"; // créer le fichier
    std::FILE* fp = std::fopen("dummy.nfo", "rb");
    assert(fp);
    std::fseek(fp, 0, SEEK_END); // se positionner à la fin
    const std::size_t filesize = std::ftell(fp);
    std::vector<std::uint8_t> buffer(filesize);
    std::fseek(fp, 0, SEEK_SET); // se positionner au début
    std::fread(buffer.data(), sizeof(std::uint8_t), buffer.size(), fp);
    std::fclose(fp);
    std::printf("I've read %zi bytes\n", filesize);
}

Sortie possible :

I've read 8 bytes

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)