Usando flujos de archivos C ++ (fstream), ¿cómo se puede determinar el tamaño de un archivo?

Estoy seguro de que me he perdido esto en el manual, pero ¿cómo se determina el tamaño de un archivo (en bytes) usando la clase istream C ++ desde el encabezado fstream ?

Puede abrir el archivo usando el indicador ios::ate (y ios::binary indicador ios::binary ), por lo que la función tellg() le dará directamente el tamaño del archivo:

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

Puedes buscar hasta el final y luego calcular la diferencia:

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

No use tellg para determinar el tamaño exacto del archivo. La longitud determinada por tellg será mayor que la cantidad de caracteres que se pueden leer en el archivo.

De stackoverflow pregunta ¿la función tellg () da el tamaño incorrecto del archivo? tellg no informa el tamaño del archivo, ni el desplazamiento desde el principio en bytes. Informa un valor de token que luego puede usarse para buscar en el mismo lugar, y nada más. (Ni siquiera está garantizado que pueda convertir el tipo a un tipo integral). Para Windows (y la mayoría de los sistemas que no son Unix), en modo texto, no hay una asignación directa e inmediata entre lo que devuelve el informe y la cantidad de bytes que debe leer para llegar a esa posición.

Si es importante saber exactamente cuántos bytes puede leer, la única manera de hacerlo de manera confiable es leyendo. Deberías poder hacer esto con algo como:

 #include  #include  ifstream file; file.open(name,std::ios::in|std::ios::binary); file.ignore( std::numeric_limits::max() ); std::streamsize length = file.gcount(); file.clear(); // Since ignore will have set eof. file.seekg( 0, std::ios_base::beg ); 

Me gusta esto:

 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; 

Soy un novato, pero esta es mi manera autodidacta de hacerlo:

 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.