2009-10-30 17 views
28

Quiero abrir un archivo para leerlo. Sin embargo, en el contexto de este programa, está bien si el archivo no existe, simplemente sigo adelante. Deseo poder identificar cuando el error es "archivo no encontrado" y cuando el error es diferente. De lo contrario, significa que necesito salir y error.ifstream: cómo saber si el archivo especificado no existe

No veo una manera obvia de hacerlo con fstream.


puedo hacer esto con open() de C y perror(). Supuse que también había una forma fstream de hacer esto.

Respuesta

5

Puesto que el resultado de la apertura de un archivo es específica del SO, no lo creo Creo que C++ estándar tiene alguna manera de diferenciar los diversos tipos de errores. El archivo se abre o no.

Puede intentar abrir el archivo para leerlo, y si no se abre, sabrá que no existe o que ha ocurrido algún otro error. Por otra parte, si intenta abrirlo para escribir después y falla, eso podría caer dentro de la categoría "otra cosa".

36

No creo que pueda saber si "el archivo no existe". Usted podría utilizar is_open() para la comprobación genérica:

ofstream file(....); 
if(!file.is_open()) 
{ 
    // error! maybe the file doesn't exist. 
} 

Si está utilizando boost podría utilizar boost::filesystem:

#include <boost/filesystem.hpp> 
int main() 
{ 
    boost::filesystem::path myfile("test.dat"); 

    if(!boost::filesystem::exists(myfile)) 
    { 
     // what do you want to do if the file doesn't exist 
    } 
} 
+6

no es de corriente sino ifstream! – Phong

+0

Tenga en cuenta que ambas formas comprueban otra cosa: es posible que el archivo esté allí pero es posible que no tenga los permisos necesarios ... – rubenvb

+3

¿No es esto una solución intrínsecamente atrevida? –

5

Puede utilizar stat, que debe ser a través de plataformas portátiles y se encuentra en la biblioteca estándar de C:

#include <sys/stat.h> 

bool FileExists(string filename) { 
    struct stat fileInfo; 
    return stat(filename.c_str(), &fileInfo) == 0; 
} 

Si stat devuelve 0, el archivo (o directorio) existe, de lo contrario no lo hace. Supongo que tendrá que tener permisos de acceso en todos los directorios en la ruta del archivo. No he probado la portabilidad, pero this page sugiere que no debería ser un problema.

+0

Debería comprobar explícitamente el código de retorno, ya que puede ser distinto de cero por razones que no sean de archivo. Consulte http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html – gerardw

+2

Esto es una cosa INCORRECTA, porque durante el tiempo DESPUÉS de que stat() regresó y ANTES de que 'fstream''s open() llegara a En realidad, al abrir un archivo, el archivo puede haber desaparecido (eliminado por otro proceso en el sistema). – PowerGamer

+0

http://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-c – Ethan

39

EDITAR: Me han notificado que esto no indica necesariamente que un archivo no existe, ya que puede estar marcado debido a permisos de acceso u otros problemas también.

Sé que es muy tarde para responder a esto, pero pensé que dejaría un comentario de todos modos para cualquier persona que navega. Puede usar el indicador de fallas de ifstream para saber si existe un archivo.

ifstream myFile("filename.txt"); 
    if(myFile.fail()){ 
     //File does not exist code here 
    } 
//otherwise, file exists 
+2

¡Gracias por esa respuesta "tardía"! Fui realmente útil para publicarlo;) – ezdazuzena

+0

¡Muy útil! Muchas gracias –

+2

Lo que sugieres NO es una forma de verificar el "archivo no encontrado". 'fail()' no indica "el archivo no existe", simplemente indica "algo está mal". En su ejemplo particular, puede ser "acceso denegado" o "violación de compartir", etc. – PowerGamer

0

La función std::fstream::good() vuelve false cuando no existe el archivo. ¿No es eso suficiente?

std::fstreamhereda esta función de std::ios.

Cuestiones relacionadas