web-dev-qa-db-fra.com

Vérifier si un fichier s'est ouvert avec succès avec ifstream

J'ai ce qui suit qui ouvrira un fichier pour la lecture. Cependant, je veux vérifier que le fichier a été ouvert avec succès, donc j'utilise l'échec pour voir si les indicateurs ont été définis. Cependant, j'obtiens toujours l'erreur suivante:

Je suis nouveau en C++, car je viens de C. Donc, je ne suis pas sûr de comprendre cette erreur:

impossible d'appeler la fonction membre "bool std :: basic_ios <_CharT, _Traits> :: fail () const [with _CharT = char, _Traits = std :: char_traits]" sans objet

Code:

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

Vous pouvez simplement faire ceci:

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 () n'est pas une méthode statique, vous devez l'appeler sur une instance pas un type, donc si vous voulez utiliser fail (), remplacez !input_stream par input_stream.fail() dans mon code ci-dessus.

Je dois me demander ce que vous essayez de réaliser ici. Vous ouvrez le fichier et le refermez immédiatement. Essayez-vous simplement de vérifier si le fichier existe?

19
Sven

Votre erreur est due au fait que vous utilisez ios::fail() comme méthode statique alors qu'il s'agit en fait d'une méthode membre.

if (input_stream.fail())
{
    ...
}
3
user7116

vous pouvez aussi utiliser std::ifstream::is_open. Renvoie true si un fichier est ouvert et associé à cet objet de flux.

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

3
Duy Đặng

Vous devez appeler fail () sur l'objet stream. Une façon plus idiomatique de faire ceci est:

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

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