web-dev-qa-db-fra.com

En utilisant C ++ filestreams (fstream), comment pouvez-vous déterminer la taille d'un fichier?

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?

71
warren

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();
86
Pepus

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;
}
57
AraK

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 );
24
Jobin

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;
9
Philip