c++ - por - Comprobando si un archivo se abrió con éxito con ifstream
manejo de archivos en c++ pdf (4)
Tengo lo siguiente que abrirá un archivo para leer. Sin embargo, quiero verificar para asegurarme de que el archivo se abrió con éxito, por lo que estoy usando el fallo para ver si se han establecido los indicadores. Sin embargo, sigo recibiendo el siguiente error:
Soy nuevo en C ++, ya que vengo de C. Así que no estoy seguro de entender este error:
no se puede llamar a la función miembro ''bool std :: basic_ios <_CharT, _Traits> :: fail () const [with _CharT = char, _Traits = std :: char_traits]'' sin objeto
Código:
int devices::open_file(std::string _file_name)
{
ifstream input_stream;
input_stream.open(_file_name.c_str(), ios::in);
if(ios::fail() == true) {
return -1;
}
file_name = _file_name;
return 0;
}
Simplemente puede hacer esto:
int devices::open_file(std::string _file_name)
{
ifstream input_stream;
input_stream.open(_file_name.c_str(), ios::in);
if(!input_stream)
{
return -1;
}
file_name = _file_name;
return 0;
}
fail () no es un método estático, debe llamarlo en una instancia, no en un tipo, por lo que si desea usar fail (), reemplace !input_stream
con input_stream.fail()
en mi código anterior.
Tengo que preguntarme qué intentas lograr aquí. Estás abriendo el archivo y lo vuelves a cerrar inmediatamente. ¿Estás simplemente tratando de comprobar si el archivo existe?
Su error se debe a que está utilizando ios::fail()
como método estático cuando en realidad es un método miembro.
if (input_stream.fail())
{
...
}
También puedes usar std::ifstream::is_open
. Devuelve verdadero si un archivo está abierto y asociado con este objeto de flujo.
// ifstream::is_open
#include <iostream> // std::cout
#include <fstream> // std::ifstream
int main () {
std::ifstream ifs ("test.txt");
if (ifs.is_open()) {
// print file:
char c = ifs.get();
while (ifs.good()) {
std::cout << c;
c = ifs.get();
}
}
else {
// show message:
std::cout << "Error opening file";
}
return 0;
}
http://www.cplusplus.com/reference/fstream/ifstream/is_open/
Tienes que llamar a fail () en el objeto de flujo. Una forma más idiomática de hacer esto es:
input_stream.open(_file_name.c_str(), ios::in);
if( ! input_stream ) {
return -1;
}