c++ - resueltos - manejo de archivos en c pdf
Usando flujos de archivos C++(fstream), ¿cómo se puede determinar el tamaño de un archivo? (5)
Esta pregunta ya tiene una respuesta aquí:
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
?
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;
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 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 <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 );
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;
}
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.