С помощью Cream filestreams (fstream), как вы можете определить размер файла?

Я уверен, что я просто пропустил это в руководстве, но как вы определяете размер файла (в байтах) с использованием класса С++ istream из заголовка fstream?

Ответ 1

Вы можете открыть файл, используя флаг ios::ateios::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.