Reputation: 22696
I have the following that will open a file for reading. However, I want to check to make sure that the file was open successfully, so I am using the fail to see if the flags have been set. However, I keep getting the following error:
I am new to C++, as I am coming from C. So not sure I understand this error:
cannot call member function ‘bool std::basic_ios<_CharT, _Traits>::fail() const [with _CharT = char, _Traits = std::char_traits]’ without object
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;
}
Upvotes: 33
Views: 77635
Reputation: 441
you can also use std::ifstream::is_open
. Returns true if a file is open and associated with this stream object.
// 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/
Upvotes: 7
Reputation: 22703
You can simply do this:
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() is not a static method, you must call it on an instance not a type, so if you want to use fail(), replace !input_stream
with input_stream.fail()
in my code above.
I do have to wonder what you're trying to achieve here. You're opening the file and immediately close it again. Are you simply trying to check if the file exists?
Upvotes: 29
Reputation: 64148
Your error is because you are using ios::fail()
as a static method when it is actually a member method.
if (input_stream.fail())
{
...
}
Upvotes: 5
Reputation:
You have to call fail() on the stream object. A more idiomatic way of doing this is:
input_stream.open(_file_name.c_str(), ios::in);
if( ! input_stream ) {
return -1;
}
Upvotes: 3