2010-03-06 608 views
31

¿Existe alguna manera fácil de comprobar si un archivo está vacío? Como si pasas un archivo a una función y te das cuenta de que está vacío, entonces lo cierras de inmediato. Gracias.Comprobación de un archivo vacío en C++

Editar, traté de usar el método fseek, pero me sale un error que dice 'no puedo convertir ifstream a FILE *'.

parámetro de mi función es

myFunction(ifstream &inFile) 
+0

Es una lástima que no pueda obtener fácilmente un descriptor de archivo de un 'fstream'. Puede verificar fácilmente un archivo vacío usando 'fstat', en Unix. :-P –

Respuesta

50

Tal vez algo parecido a:

bool is_empty(std::ifstream& pFile) 
{ 
    return pFile.peek() == std::ifstream::traits_type::eof(); 
} 

corto y dulce.


Con las preocupaciones a su error, las otras respuestas utilizar el acceso de archivos de tipo C, donde se obtiene una FILE* con funciones específicas.

Por el contrario, usted y yo estamos trabajando con flujos de C++, y como tales no pueden usar esas funciones. El código anterior funciona de una manera simple: peek() echará un vistazo a la transmisión y devolverá, sin eliminar, el siguiente carácter. Si llega al final del archivo, devuelve eof(). Ergo, acabamos de llamar al peek() en la transmisión y ver si es eof(), ya que un archivo vacío no tiene nada que ver.

Nota, esto también devuelve verdadero si el archivo nunca se abrió en primer lugar, lo que debería funcionar en su caso. Si no desea que:

std::ifstream file("filename"); 

if (!file) 
{ 
    // file is not open 
} 

if (is_empty(file)) 
{ 
    // file is empty 
} 

// file is open and not empty 
+0

no sería demasiado difícil agregar 'return pFile.tellg()> 0 || ... ' – Potatoswatter

+1

¡Qué respuesta ... – IssamTP

5

Se desplaza hasta el final del archivo y comprobar la posición:

fseek(fileDescriptor, 0, SEEK_END); 
if (ftell(fileDescriptor) == 0) { 
    // file is empty... 
} else { 
    // file is not empty, go back to the beginning: 
    fseek(fileDescriptor, 0, SEEK_SET); 
} 

Si usted no tiene el archivo abierto ya, sólo tiene que utilizar la función fstat y verifique el tamaño del archivo directamente.

0
pFile = fopen("file", "r"); 
fseek (pFile, 0, SEEK_END); 
size=ftell (pFile); 
if (size) { 
    fseek(pFile, 0, SEEK_SET); 
    do something... 
} 

fclose(pFile) 
+1

formatee el código usando el botón de la barra de herramientas que se parece a '100110' – t0mm13b

+0

Código torpe. No recomendado. – SmallChess

7

Bien, este código debería funcionar para usted. Cambié los nombres para que coincida con tu parámetro.

inFile.seekg(0, ios::end); 
if (inFile.tellg() == 0) {  
    // ...do something with empty file... 
} 
1
char ch; 
FILE *f = fopen("file.txt", "r"); 

if(fscanf(f,"%c",&ch)==EOF) 
{ 
    printf("File is Empty"); 
} 
fclose(f); 
+1

¿Por qué utilizarías estos modismos C en C++? –

0

¿Qué tal (aunque no elegante manera)

int main(int argc, char* argv[]) 
{ 
    std::ifstream file; 
    file.open("example.txt"); 

    bool isEmpty(true); 
    std::string line; 

    while(file >> line) 
     isEmpty = false; 

     std::cout << isEmpty << std::endl; 
} 
+1

Bastante justo. Es ligeramente mejor (debido a que es _actual_ C++, no C) que el user4471014, aunque sigue siendo un desperdicio total y no es óptimo. –

+0

@LightnessRacesinOrbit, tiene razón, sin embargo, no es necesario pasar por todas las líneas de un archivo.El ciclo while podría detenerse una vez que se detecta la primera línea y establecer 'isEmpty' en' false'. Si eso pudiera mejorar el código. – CroCo

+0

Entiendo que este código no es óptimo, pero ¿por qué es un desperdicio? El OP no está pidiendo o buscando un código suficiente o tan optimizado. – CroCo

-1
if (nfile.eof()) // Prompt data from the Priming read: 
    nfile >> CODE >> QTY >> PRICE; 
else 
{ 
    /*used to check that the file is not empty*/ 
    ofile << "empty file!!" << endl; 
    return 1; 
} 
+1

Si bien esto podría proporcionar una solución a la pregunta de OP, no hay una explicación del código. –

1

uso esto: data.peek() = '\ 0! '

¡He estado buscando por una hora hasta que esto ayude!

+0

¿Cómo es esto mejor que la respuesta aceptada? – Norrius

Cuestiones relacionadas