Я уверен, что я просто пропустил это в руководстве, но как вы определяете размер файла (в байтах) с использованием класса С++ istream
из заголовка fstream
?
С помощью Cream filestreams (fstream), как вы можете определить размер файла?
Ответ 1
Вы можете открыть файл, используя флаг ios::ate
(и ios::binary
), поэтому функция tellg()
даст вам непосредственно размер файла:
ifstream file( "example.txt", ios::binary | ios::ate);
return file.tellg();
Ответ 2
Вы можете искать до конца, а затем вычислить разницу:
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;
}
Ответ 3
Не используйте 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 );
Ответ 4
Вот так:
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;
Ответ 5
Я новичок, но это мой способ обучения самому себе:
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.