2010-02-17 18 views
10

Estoy usando Linux y C++. Tengo un archivo binario con un tamaño de 210732 bytes, pero el tamaño indicado con seekg/tellg es 210728.C++: obteniendo un tamaño de archivo incorrecto

consigo la siguiente información de ls-la, es decir, 210732 bytes:

-RW -rw-r-- 1 pjs pjs 210732 Feb 17 de 10:25 output.osr

Y con el siguiente fragmento de código, consigo 210728:

std::ifstream handle; 
handle.open("output.osr", std::ios::binary | std::ios::in); 
handle.seekg(0, std::ios::end); 
std::cout << "file size:" << static_cast<unsigned int>(handle.tellg()) << std::endl; 

Así que mi código está desactivada de 4 bytes . He confirmado que el tamaño del archivo es correcto con un editor hexadecimal. Entonces, ¿por qué no obtengo el tamaño correcto?

Mi respuesta: Creo que el problema fue causado por tener múltiples fstream abiertos en el archivo. Al menos eso parece haberlo solucionado. Gracias a todos los que ayudaron.

+0

Es este el caso en todos los sistemas de archivos (en el caso tienes varios)? – hlovdal

+0

Desafortunadamente, no tengo la opción de probar en un sistema de archivos diferente. – PSJ

+0

Funciona bien en mi sistema Ubuntu de 32 bits. ¿Usas g ++? – tur1ng

Respuesta

3

Al menos para mí con G ++ 4.1 y 4.4 en CentOS 5 de 64 bits, el código siguiente funciona como se esperaba, es decir, la longitud que imprime el programa es la misma que la devuelta por la llamada stat().


#include <iostream> 
#include <fstream> 
using namespace std; 

int main() { 
    int length; 

    ifstream is; 
    is.open ("test.txt", ios::binary | std::ios::in); 

    // get length of file: 
    is.seekg (0, ios::end); 
    length = is.tellg(); 
    is.seekg (0, ios::beg); 

    cout << "Length: " << length << "\nThe following should be zero: " 
     << is.tellg() << "\n"; 

    return 0; 
} 
+0

Gracias. Sorprendentemente, esto realmente me da la respuesta correcta. No entiendo por qué, pero me proporciona el resultado que estoy buscando. – PSJ

+0

pero eso es exactamente el mismo código, aparte de la conversión estática a unsigned int – pm100

+0

Sí, debo tener algo en alguna parte, que está interfiriendo. Estoy tratando de resolverlo. – PSJ

9

¿Por qué está abriendo el archivo y verificando el tamaño? La forma más fácil es hacer que algo como esto:

 
#include <sys/types.h> 
#include <sys/stat.h> 

off_t getFilesize(const char *path){ 
    struct stat fStat; 
    if (!stat(path, &fStat)) return fStat.st_size; 
    else perror("file Stat failed"); 
} 

Editar: Gracias PSJ por señalar un problema técnico menor error tipográfico ... :)

+0

¿Noté que esto fue votado negativamente y luego votado? ¿Por qué? – t0mm13b

+1

Probablemente porque no responde la pregunta –

+0

@Neil: Oh ... Habló acerca de abrir el archivo y buscar hasta el final para obtener el tamaño y arrojó resultados incorrectos ... Me preguntaba por qué no utilizar esto función en lugar de tener que abrir/cerrar el archivo ...? – t0mm13b

1

¿Es posible que ls -la realmente informe el número de bytes que ocupa el archivo en el disco, en lugar de su tamaño real? Eso explicaría por qué es un poco más alto.

+0

Ese fue mi pensamiento también. Estoy generando el archivo yo mismo y estoy poniendo 210732 bytes en el archivo, también cuando inspecciono el archivo con ghex2, en realidad contiene todos los bytes. – PSJ

2

Cuando en una variedad de Unix, ¿por qué usamos eso, cuando tenemos la utlilty stat

long findSize(const char *filename) 
{ 
    struct stat statbuf; 
    if (stat(filename, &statbuf) == 0) 
    { 
     return statbuf.st_size; 
    } 
    else 
    { 
     return 0; 
    } 
} 

si no,

long findSize(const char *filename) 
{ 
    long l,m; 
    ifstream file (filename, ios::in|ios::binary); 
    l = file.tellg(); 
    file.seekg (0, ios::end); 
    m = file.tellg(); 
    file.close(); 
    return (m – l); 
} 
Cuestiones relacionadas