c++ - sirve - ifstream: cómo saber si el archivo especificado no existe
guardar y leer datos en un archivo.txt en c++ (9)
Déjenme dar ejemplo con una ejecución real:
- el archivo no existe:
- archivo existe:
ver http://www.cplusplus.com/reference/fstream/ifstream/ para más información sobre su función pública.
Quiero abrir un archivo para leer. 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.
No veo una manera obvia de hacer esto con fstream
.
Puedo hacer esto con C''s open()
y perror()
. fstream
que también había una forma fstream
de hacer esto.
Dado que el resultado de abrir un archivo es específico del sistema operativo, no creo que el estándar C ++ tenga alguna forma 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".
De forma recta sin crear un objeto ifstream.
if (!std::ifstream(filename))
{
// error! file doesn''t exist.
}
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.
Sé que llegué muy tarde respondiendo esto, pero pensé que de todos modos dejaría un comentario para cualquiera que esté navegando. 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
La función std::fstream::good()
devuelve false
cuando el archivo no existe. ¿No es eso suficiente?
std::fstream
hereda esta función de std::ios
.
No creo que puedas saber si "el archivo no existe". Puede usar is_open () para comprobación genérica:
ofstream file(....);
if(!file.is_open())
{
// error! maybe the file doesn''t exist.
}
Si está utilizando boost
puede usar 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
}
}
Puede usar stat, que debe ser portable en todas las plataformas y se encuentra en la biblioteca C estándar:
#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 esta página sugiere que no debería ser un problema.
Una forma simple de http://www.cplusplus.com/forum/general/1796/
ifstream ifile(filename);
if (ifile) {
// The file exists, and is open for input
}
Una mejor manera:
std::ifstream stream;
stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
stream.open(fileName, std::ios::binary);