2011-06-06 18 views
15

Tengo lo siguiente que abrirá un archivo para leer. Sin embargo, quiero verificar para asegurarse de que el archivo se haya abierto correctamente, por lo que estoy utilizando el error para ver si se han establecido los indicadores. Sin embargo, me siguen dando el siguiente error:Comprobando si un archivo se abrió correctamente con ifstream

Soy nuevo en C++, como yo vengo de C. Así que no estoy seguro de entender este error:

cannot call member function ‘bool std::basic_ios<_CharT, _Traits>::fail() const [with _CharT = char, _Traits = std::char_traits]’ without object

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; 
} 

Respuesta

15

usted puede simplemente 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; 
} 

fallan() no es un método estático, debe llamarlo en una instancia no un tipo, por lo si desea utilizar fail(), reemplace !input_stream con input_stream.fail() en mi código anterior.

Tengo que preguntarme qué estás tratando de lograr aquí. Está abriendo el archivo y lo cierra de inmediato. ¿Estás simplemente tratando de verificar si el archivo existe?

+0

Hola, gracias por la respuesta. HOwever, me pregunto por qué la bandera fallida nunca funcionó para mí. – ant2009

+1

El uso de 'input_stream.fail()' debería tener el mismo efecto que '! Input_stream'. Como dije, no puedes usar 'ios :: fail()' porque es un método de instancia, no un método estático. – Sven

+3

Por favor, ¿por qué usar la bandera 'ios :: in' con' ifstream'? – nn0p

1

Tiene que llamar a fail() en el objeto de secuencia. Una forma más idiomática de hacer esto es:

input_stream.open(_file_name.c_str(), ios::in); 

if(! input_stream) { 
    return -1; 
} 
3

Su error es porque está utilizando ios::fail() como un método estático cuando en realidad es un método miembro.

if (input_stream.fail()) 
{ 
    ... 
} 
2

también puedes utilizar std::ifstream::is_open. Devuelve verdadero si un archivo está abierto y asociado a este objeto de transmisión.

// 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/

Cuestiones relacionadas