我有以下内容将打开一个文件进行阅读。但是,我想检查以确保文件已成功打开,因此我使用失败来查看是否已设置标志。但是,我一直收到以下错误:
我是C ++的新手,因为我来自C。所以我不确定我是否理解这个错误:
无法调用成员函数'bool std :: basic_ios< _CharT, _Traits> :: fail()const [with _CharT = char,_Traits = std :: char_traits]'without object
代码:
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;
}
答案 0 :(得分:19)
你可以这样做:
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()不是静态方法,您必须在不是类型的实例上调用它,因此如果要使用fail(),请在上面的代码中将!input_stream
替换为input_stream.fail()
。
我不得不怀疑你在这里想要实现的目标。您正在打开该文件并立即再次关闭它。您只是想检查文件是否存在吗?
答案 1 :(得分:3)
您的错误是因为当ios::fail()
实际上是成员方法时,您使用if (input_stream.fail())
{
...
}
作为静态方法。
{{1}}
答案 2 :(得分:3)
您也可以使用std::ifstream::is_open
。如果文件已打开并与此流对象关联,则返回true。
// 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 :(得分:1)
您必须在流对象上调用fail()。更为惯用的方法是:
input_stream.open(_file_name.c_str(), ios::in);
if( ! input_stream ) {
return -1;
}