Проверка успешного открытия файла с помощью ifstream - PullRequest
18 голосов
/ 06 июня 2011

У меня есть следующее, что откроет файл для чтения.Тем не менее, я хочу проверить, чтобы файл был успешно открыт, поэтому я использую неспособность увидеть, были ли установлены флаги.Тем не менее, я получаю следующую ошибку:

Я новичок в C ++, так как я пришел из 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;
}

Ответы [ 4 ]

19 голосов
/ 06 июня 2011

Вы можете просто сделать это:

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() в моем коде выше.

Мне действительно интересно, чего вы здесь добиваетесь.Вы открываете файл и немедленно закрываете его снова.Вы просто пытаетесь проверить, существует ли файл?

3 голосов
/ 06 февраля 2017

вы также можете использовать 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 голосов
/ 06 июня 2011

Ваша ошибка в том, что вы используете ios::fail() в качестве статического метода, когда он на самом деле является методом-членом.

if (input_stream.fail())
{
    ...
}
1 голос
/ 06 июня 2011

Вы должны вызвать fail () для объекта потока.Более идиоматический способ сделать это:

input_stream.open(_file_name.c_str(), ios::in);

if( ! input_stream ) {
    return -1;
}
...