2010-03-09 4 views

Antwort

75

Sie die Datei öffnen können mit der ios::ate Flag (und ios::binary Flagge), so dass die tellg() Funktion gibt Ihnen direkt die Dateigröße:

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

@Dominik Honnef: in VS 2013 Update5 64 Bit dieser Ansatz, mit _ios: ate_flag und ohne _seekg (0, ios: end) _ möglicherweise nicht für große Dateien. Weitere Informationen finden Sie unter http://stackoverflow.com/questions/32057750/how-to-get-the-filesize-for-large-files-in-c. –

+2

Dies scheint nicht ein guter Ansatz zu sein. [tellg meldet weder die Größe der Datei noch den Offset vom Anfang in Bytes] (http://stackoverflow.com/a/22986486/1835769). – displayName

+0

@displayName [cplusplus.com] (http://www.cplusplus.com/reference/istream/istream/seekg/) stimmt dieser Aussage nicht zu: Es verwendet tatsächlich 'tellg()', um Dateigröße zu erkennen. –

49

Sie bis zum Ende suchen können, berechnen dann den Unterschied:

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; 
} 
+0

awesome! danke =) – warren

+0

änderte size_t zu streampos. – AraK

+7

Aus Interesse, ist der erste Anruf zu 'tellg' nicht garantiert, um 0 zurückzugeben? –

8

So:

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

Vielleicht möchten Sie die geeignetere 'std :: streampos' anstelle von' long' verwenden, da die letztere einen so großen Bereich wie die vorherige nicht unterstützt - und 'streampos' * ist * mehr als nur eine Ganzzahl. –

-2

Ich bin ein Neuling, aber das ist mein Autodidakt Art und Weise tun:

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. 
+5

all dies ist bestimmt, ob es ein erstes Zeichen gibt. Wie hilft das? – warren

10

nicht tellg Verwenden Sie die genaue Größe der Datei zu bestimmen. Die von tellg festgelegte Länge ist größer als die Anzahl der Zeichen, die aus der Datei gelesen werden können.

Von stackoverflow Frage tellg() function give wrong size of file?tellg meldet nicht die Größe der Datei, noch der Offset vom Anfang in Bytes. Es meldet einen Token-Wert, der später verwendet werden kann, um an denselben Ort zu suchen, und nicht mehr. (Es ist nicht einmal garantiert, dass Sie den Typ in einen ganzzahligen Typ konvertieren können.). Für Windows (und die meisten Nicht-Unix-Systeme) gibt es im Textmodus keine direkte und direkte Zuordnung zwischen der Rückgabe von tallg und der Anzahl von Bytes, die Sie lesen müssen, um an diese Position zu gelangen.

Wenn es wichtig ist, genau zu wissen, wie viele Bytes Sie lesen können, die einzige Möglichkeit, sicher so tun, ist durch Lesen. Sie sollten dies wie mit etwas zu tun in der Lage:

#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); 
Verwandte Themen