Вы абсолютно уверены, что save_file_handle
не имеет файла, связанного (открытого) с ним? Если это произойдет, то вызов метода open()
завершится неудачей и поднимет флаг ошибки ios::failbit
- и любые исключения, если он будет установлен.
Метод close()
не может завершиться ошибкой, если файл не открыт, и в этом случае метод вызовет флаг ошибки ios::failbit
. В любом случае деструктор должен закрыть файл и сделать это автоматически, если save_file_handle
является переменной стека, как в вашем коде.
int Saver::output()
{
save_file_handle.open(file_name.c_str());
if (save_file_handle.fail())
{
x_message("Error - file failed to previously close");
return 0;
}
save_file_handle << save_str.c_str();
if (save_file_handle.bad())
{
x_message("Error - failed to save file");
return 0;
}
return 1;
}
Кроме того, вы можете отделить проверку ошибок от логики сохранения файла, если вы используете ios::exceptions()
.
int Saver::output()
{
ios_base::iostate old = save_file_handle.exceptions();
save_file_handle.exceptions(ios::failbit | ios::badbit);
try
{
save_file_handle.open(file_name.c_str());
save_file_handle << save_str.c_str();
}
catch (ofstream::failure e)
{
x_message("Error - couldn't save file");
save_file_handle.exceptions(old);
return 0;
}
save_file_handle.exceptions(old);
return 1;
}
Вы можете предпочесть перевести вызов на save_file_handle.exceptions(ios::failbit | ios::badbit)
в конструктор (ы). Затем вы можете избавиться от операторов, которые сбрасывают флаг исключений.