IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Récupérer la taille d'un fichier en C++ : méthode fiable ?


Sujet :

Langage C++

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Récupérer la taille d'un fichier en C++ : méthode fiable ?
    Bonjour.

    Je voudrai savoir comment récupérer la taille d'un fichier de façon fiable et portable. Sur la page de tellg de cppreference, on a plus ou moins l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    long long int length = 0;
    std::ifstream is;
    is.open ("test.txt", std::ios::binary );
    is.seekg (0, std::ios::end);
    length = is.tellg();
    1ère question : est-ce 100% équivalent à (si ça ne l'est pas, pourquoi ?) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ifstream is("test.txt", ios::binary | std::ios::ate );
    long long int length = is.tellg();
    2ème question : est-ce que cette méthode me permet effectivement de récupérer la taille d'un fichier en octets de façon fiable ? Si ce n'est pas le cas, pourquoi ? Si ce n'est pas le cas sur toutes les architectures, ai-je au moins cette garantie sur les systèmes Linux, Windows, Apple, x86 et x64 ?

    3ème question :
    Est-ce que std::ifstream::seekg(0); std::ifstream::tellg(); est équivalent à std::ifstream::seekg(0, std::ios::beg); std::ifstream::tellg(); ? Si ce ne l'est pas dans quels cas cela pourrait-il donner un résultat différent ?

    4ème question :
    Est-ce qu'à l'ouverture d'un fichier en mode binaire (et pas en mode std::ios::ate), j'ai la garantie que std::ifstream::tellg(); retourne 0 ?

    5ème question :
    En supposant que j'ai des fichiers de moins d'un exaoctet (ce qui est raisonnable à mon avis), comment convertir de façon portable un std::streampos ou un std::streamoff en long long int ?

    Si vous avez des remarques ou des meilleures façons de mesurer la taille d'un fichier, je suis preneur.

    Merci beaucoup

    EDIT : précision (je ne considère ici que du C++11 standard ISO, pas de POSIX, pas de boost)

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Pour la méthode, c'est ce qui est donné dans la FAQ - Comment calculer la taille d'un fichier ?
    Pour les questions, je laisse des personnes plus habitué que moi à ifstream (oh que j'aime les QFile et boost.filesystem )

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    la plupart des réponses sont trouvables en lisant la doc de std::ifstream (qui est un peu fouilli au début parce qu'il faut souvent faire référence à istream, stream etc)
    1) oui
    2) oui
    3) oui
    4) oui, mais le mode ate (at end) est complètement orthogonal au mode binary
    5) http://www.cplusplus.com/reference/iostream/streamoff/
    must be able to be consistently converted to both streamsize and fpos
    http://www.cplusplus.com/reference/iostream/streamsize/
    The type is an implementation-defined synonym of one of the signed basic integral types (generally signed int or signed long)
    donc un long long pourra aisément le contenir (unsigned ou non), avec "au pire" un static_cast
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/02/2007, 19h33
  2. Récupérer la taille d'un fichier
    Par kivan666 dans le forum Général JavaScript
    Réponses: 39
    Dernier message: 26/07/2006, 13h15
  3. Récupérer la taille d'un fichier
    Par vodevil dans le forum Langage
    Réponses: 12
    Dernier message: 19/07/2005, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo