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?
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();
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;
}
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 );
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;
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.