Это решение добавляет проверку ошибок в метод, основанный на rdbuf ().
std::string file_to_string(const std::string& file_name)
{
std::ifstream file_stream{file_name};
if (file_stream.fail())
{
// Error opening file.
}
std::ostringstream str_stream{};
file_stream >> str_stream.rdbuf(); // NOT str_stream << file_stream.rdbuf()
if (file_stream.fail() && !file_stream.eof())
{
// Error reading file.
}
return str_stream.str();
}
Я добавляю этот ответ, потому что добавление проверки ошибок в исходный метод не так тривиально, как вы ожидаете. Оригинальный метод использует оператор вставки stringstream (str_stream << file_stream.rdbuf()
). Проблема в том, что это устанавливает битовый поток stringstream, когда никакие символы не вставлены. Это может быть связано с ошибкой или с пустым файлом. Если вы проверите на наличие ошибок, проверив бит-бит, вы получите ложное срабатывание при чтении пустого файла. Как вы устраняете неоднозначность законного сбоя при вставке любых символов и «сбоя» при вставке любых символов, потому что файл пуст?
Вы можете явно проверить наличие пустого файла, но это больше кода и связанной с ним проверки ошибок.
Проверка состояния сбоя str_stream.fail() && !str_stream.eof()
не работает, потому что операция вставки не устанавливает eofbit (для потока ostring или ifstream).
Итак, решение состоит в том, чтобы изменить операцию. Вместо использования оператора вставки ostringstream (<<), используйте оператор извлечения ifstream (>>), который устанавливает eofbit. Затем проверьте состояние отказа file_stream.fail() && !file_stream.eof()
.
Важно, что когда file_stream >> str_stream.rdbuf()
встречает законный сбой, он никогда не должен устанавливать eofbit (согласно моему пониманию спецификации). Это означает, что вышеупомянутой проверки достаточно для обнаружения законных сбоев.