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

StackOverflow https://stackoverflow.com/questions/2409504

  •  18-09-2019
  •  | 
  •  

Question

    

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

         

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

Était-ce utile?

La solution

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

ifstream file( "example.txt", ios::binary | ios::ate);
return file.tellg();

Autres conseils

Vous pouvez rechercher 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;
}

Ne pas utiliser tellg pour déterminer la taille exacte du fichier. La longueur déterminée par tellg sera plus grand que le nombre de caractères peut être lu à partir du fichier.

De la question stackoverflow fonction tellg () donnent la mauvaise taille de fichier? tellg ne signale pas la taille du fichier, ni le décalage depuis le début en octets. Il fait état d'une valeur symbolique qui peut ensuite être utilisé pour chercher à la même place, et rien de plus. (Il est même pas garanti que vous pouvez convertir le type à 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 tellg retours et le nombre d'octets que vous devez lire pour se rendre à cette position.

S'il est important de savoir exactement combien d'octets vous pouvez lire, la seule façon de le faire est fiable si en lisant. Vous devriez être en mesure de 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 un 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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top