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;
}
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?
Your error is because you are using ios::fail()
as a static method when it is actually a member method.
if (input_stream.fail())
{
...
}
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/
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;
}