LINUX.ORG.RU

C++ исключение при работе с файлами

 , ,


1

3

Хочу разобраться как срабатывают исключения при работе с файлами. Нагуглил ссылку. Попробовал запустить пример, получил

terminate called after throwing an instance of 'std::ios_base::failure'
  what():  basic_ios::clear
Aborted (core dumped)
Пробовал менять тип исключения на std::ios_base::failure, но результат тот же, только замена на std::exception дала желанный результат. Гуглил по всяким SO, там либо дают ту же ссылку, либо похожие примеры. Это что-то у меня не так или в примере ошибка?

У меня работает пример по ссылке...

fsb4000 ★★★★★
()

Пример довольно странный
Если есть файл, нормально открывается и читается - всё равно выдаёт ошибку.

solom
()

Флаг `failbit` означает «выбрасывать исключение при неудачном чтении следующего байта». Видимо, в некоторых реализациях неудачное чтение байта происходит до установки флага eof.

Я бы вообще советовал не выставлять failbit для файлов, которые следует читать — этот флаг скорее для проверяемой записи.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

По идее при неудачной попытке открыть файл, должен устанавливаться failbit и бросаться соответствующее исключение. И судя по всему оно бросается, но не перехватывается, по крайней мере пока не поменять тип перехватываемого исключения на std::exception, хотя должно работать с std::ifstream::failure и с std::ios_base::failure, но не работает.

flyshoot
() автор топика
Ответ на: комментарий от solom

Да, у меня также. Что-то я не пойму как использовать исключения тут...

flyshoot
() автор топика

Попробуйте вот в таком виде:

// ios::exceptions
#define _GLIBCXX_USE_CXX11_ABI 0
#include <iostream>     // std::cerr
#include <fstream>      // std::ifstream

int main () {
  std::ifstream file;
  file.exceptions ( std::ifstream::failbit | std::ifstream::badbit );
  try {
    file.open ("test.txt");
    while (!file.eof()) file.get();
    file.close();
  }
  catch (const std::ios_base::failure & e) {
    std::cerr << "Exception opening/reading/closing file" << std::flush;
  }

  return 0;
}
Вроде вот здесь собака зарыта. И обещают исправить в gcc 7.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Спасибо. Поясните, пожалуйста ещё один момент в этом примере. Как уже писали выше, если в пример подать существующий файл, то исключение будет выброшено всё равно. Потестировав пример, я понял, что исключение выбрасывается при попытке прочитать символ после последнего. Это значит, что условие цикла записано неверно? Если так, то как правильно?

flyshoot
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.