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;
}
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?
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())
{
...
}
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/
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;
}