En utilisant C++ filestreams (fstream), Comment Pouvez-vous déterminer la taille d'un fichier? [dupliquer]

cette question a déjà une réponse ici:

  • Comment puis-je obtenir la taille d'un fichier en C++? [duplicate] 7 réponses

je suis sûr que j'ai juste manqué cela dans le manuel, mais comment déterminer la taille d'un fichier (en octets) en utilisant C++ 'S istream classe de la fstream l'en-tête?

68
demandé sur warren 2010-03-09 17:00:59

5 réponses

vous pouvez ouvrir le fichier en utilisant le drapeau ios::ate (et le drapeau ios::binary ), ainsi la fonction tellg() vous donnera directement la taille du fichier:

ifstream file( "example.txt", ios::binary | ios::ate);
return file.tellg();
80
répondu Pepus 2012-11-15 09:19:59

vous pouvez chercher jusqu'à la fin, puis calculer la différence:

std::streampos fileSize( const char* filePath ){

    std::streampos fsize = 0;
    std::ifstream file( filePath, std::ios::binary );

    fsize = file.tellg();
    file.seekg( 0, std::ios::end );
    fsize = file.tellg() - fsize;
    file.close();

    return fsize;
}
53
répondu AraK 2010-03-09 14:04:41

N'utilisez pas tellg pour déterminer la taille exacte du fichier. La durée déterminée par tellg sera plus grande que le nombre de caractères peut être lu à partir du fichier.

De stackoverflow question tellg() de la fonction de donner mauvaise taille de fichier? tellg ne rapporte pas la taille du fichier, ni le décalage du début en octets. Il rapporte une valeur symbolique qui peut être utilisée plus tard pour chercher au même endroit, et rien plus. (Il n'est même pas garanti que vous pouvez convertir le type d'un type intégral.). Pour Windows (et la plupart des systèmes non-Unix), en mode texte, il n'y a pas de correspondance directe et immédiate entre ce que tellg renvoie et le nombre d'octets que vous devez lire pour atteindre cette position.

S'il est important de savoir exactement combien d'octets vous pouvez lire, la seule façon fiable de le faire est de lire. Vous devriez pouvoir le faire avec quelque chose comme:

#include <fstream>
#include <limits>

ifstream file;
file.open(name,std::ios::in|std::ios::binary);
file.ignore( std::numeric_limits<std::streamsize>::max() );
std::streamsize length = file.gcount();
file.clear();   //  Since ignore will have set eof.
file.seekg( 0, std::ios_base::beg );
21
répondu Jobin 2017-05-23 12:09:58

comme ceci:

long begin, end;
ifstream myfile ("example.txt");
begin = myfile.tellg();
myfile.seekg (0, ios::end);
end = myfile.tellg();
myfile.close();
cout << "size: " << (end-begin) << " bytes." << endl;
9
répondu Philip 2011-12-12 19:17:40

je suis novice, mais c'est ma façon autodidacte de le faire:

ifstream input_file("example.txt", ios::in | ios::binary)

streambuf* buf_ptr =  input_file.rdbuf(); //pointer to the stream buffer

input.get(); //extract one char from the stream, to activate the buffer
input.unget(); //put the character back to undo the get()

size_t file_size = buf_ptr->in_avail();
//a value of 0 will be returned if the stream was not activated, per line 3.
-2
répondu Chris X 2013-09-06 03:26:11