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 :
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
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();
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 ?
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();
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)
Partager