Usando FileStreams C ++ (fstream), como você pode determinar o tamanho de um arquivo?

votos
64

Eu tenho certeza que eu só perdeu isto no manual, mas como é possível determinar o tamanho de um arquivo (em bytes) usando 's C ++ istreamclasse do fstreamcabeçalho?

Publicado 09/03/2010 em 15:00
fonte usuário
Em outras línguas...                            


5 respostas

votos
76

Você pode abrir o arquivo usando o ios::ateflag (e ios::binarybandeira), de modo a tellg()função irá dar-lhe diretamente o tamanho do arquivo:

ifstream file( "example.txt", ios::binary | ios::ate);
return file.tellg();
Respondeu 15/11/2012 em 10:00
fonte usuário

votos
50

Você pode procurar até o fim, em seguida, calcular a diferença:

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;
}
Respondeu 09/03/2010 em 15:04
fonte usuário

votos
14

Não utilizar tellgpara determinar o tamanho exato do arquivo. O comprimento determinado pelo tellgserá maior do que o número de caracteres podem ser lidos a partir do arquivo.

De stackoverflow pergunta função tellg () dar errado tamanho de arquivo? tellgnão informa o tamanho do arquivo, nem o deslocamento desde o início, em bytes. Ele relata um valor simbólico que pode ser usado posteriormente para procurar para o mesmo lugar, e nada mais. (Nem sequer é garantido que você pode converter o tipo para um tipo integral.). Para o Windows (e a maioria dos sistemas não-Unix), em modo texto, não existe um mapeamento direto e imediato entre o que tellg retornos e o número de bytes que você deve ler para chegar a essa posição.

Se é importante saber exatamente quantos bytes você pode ler, a única maneira de fazer de forma confiável isso é através da leitura. Você deve ser capaz de fazer isso com algo como:

#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 );
Respondeu 14/06/2016 em 09:29
fonte usuário

votos
8

Como isso:

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;
Respondeu 09/03/2010 em 15:06
fonte usuário

votos
-2

Eu sou um novato, mas esta é a minha autodidata maneira de fazê-lo:

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.
Respondeu 06/09/2013 em 04:08
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more