Используя C++ filestreams (fstream), как вы можете определить размер файла? [дубликат]
этот вопрос уже есть ответ здесь:
Как я могу получить размер файла в C++? [дубликат]
7 ответов
Я уверен, что я только что пропустил это в руководстве, но как вы определяете размер файла (в байтах) с помощью C++'S istream класс fstream заголовок?
5 ответов:
вы можете открыть файл с помощью
ios::ateфлаг (иios::binaryфлаг), поэтомуtellg()функция даст вам непосредственно размер файла:ifstream file( "example.txt", ios::binary | ios::ate); return file.tellg();
вы можете искать до конца, а затем вычислить разницу:
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; }
не используйте
tellgчтобы определить точный размер файла. Длина определяется поtellgбудет больше, чем количество символов, которые можно прочитать из файла.из stackoverflow вопрос функция tellg () дает неправильный размер файла?
tellgне сообщает размер файла, ни смещение от начала в байтах. Он сообщает значение токена, которое позже может быть использовано для поиска в том же месте, и ничего больше. (Это даже не гарантирует, что вы можно преобразовать тип в интегральный тип.). Для Windows (и большинства систем, отличных от Unix) в текстовом режиме нет прямого и непосредственного сопоставления между тем, что возвращает tellg, и количеством байтов, которые вы должны прочитать, чтобы добраться до этой позиции.если важно точно знать, сколько байтов вы можете прочитать, единственный способ надежно сделать это-чтение. Вы должны быть в состоянии сделать что-то вроде:
#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 );
такой:
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;
Я новичок, но это мой самоучка способ сделать это:
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.
Comments