Проверка успешного открытия файла с помощью ifstream
У меня есть следующее, которое откроет файл для чтения. Тем не менее, я хочу проверить, чтобы файл был открыт успешно, поэтому я использую ошибку, чтобы проверить, установлены ли флаги. Тем не менее, я продолжаю получать следующую ошибку:
Я новичок в С++, так как я исхожу от C. Поэтому не уверен, что понимаю эту ошибку:
не может вызвать функцию-член 'bool std:: basic_ios < _CharT, _Traits > :: fail() const [с _CharT = char, _Traits = std:: char_traits] без объекта
код:
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;
}
Ответы
Ответ 1
Вы можете просто сделать это:
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()
в моем коде выше.
Мне нужно задаться вопросом, чего вы пытаетесь достичь здесь. Вы открываете файл и сразу же закрываете его. Вы просто пытаетесь проверить, существует ли файл?
Ответ 2
Ваша ошибка связана с тем, что вы используете ios::fail()
как статический метод, когда это фактически метод-член.
if (input_stream.fail())
{
...
}
Ответ 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/
Ответ 4
Вы должны вызвать fail() для объекта потока. Более идиоматический способ сделать это:
input_stream.open(_file_name.c_str(), ios::in);
if( ! input_stream ) {
return -1;
}