Je suis sûr que je viens juste de manquer cela dans le manuel, mais comment déterminer la taille d'un fichier (en octets) à l'aide de la classe istream
de C++ à partir de l'en-tête fstream
?
Vous pouvez ouvrir le fichier en utilisant l'indicateur ios::ate
(Et l'indicateur ios::binary
). 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 longueur déterminée par tellg
sera supérieure au nombre de caractères pouvant être lus dans le fichier.
De stackoverflow question la fonction tellg () donne une taille de fichier incorrecte?tellg
ne rapporte pas la taille du fichier, ni le décalage depuis le début en octets. Il rapporte une valeur de jeton qui peut ensuite être utilisée pour rechercher le même endroit, et rien de plus. (Il n'est même pas garanti que vous puissiez convertir le type en 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 les informations renvoyées par tellg et le nombre d'octets à lire pour accéder à cette position.
S'il est important de savoir exactement combien d'octets vous pouvez lire, le seul moyen fiable de le faire est de le lire. Vous devriez pouvoir faire ceci 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 ça:
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;