Вы можете использовать утилиты rdstate , чтобы проверить (и при необходимости сбросить) состояние потока входного файла.
В вашей программе это будет, например, работать следующим образом:
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ifstream file("sample.txt");
std::string content = std::string((
std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>());
std::cout << "Reading status: " << file.rdstate() << std::endl;
if (file.rdstate())
std::cout << "Reading the file failed" << std::endl;
return 0;
}
Первый вывод для демонстрации - file.rdstate
будет 0, если все прошло хорошо. Если что-то пошло не так, его значение будет зависеть от суммы трех флагов, которые этому способствуют. Рекомендую прочитать цитируемую ссылку.
Оператор if
- это фактическая проверка, которую вы можете использовать в своей программе. Вы также можете добавить туда исключение или даже заменить if на assert - обе стратегии в случае, если вы действительно хотите, чтобы программа остановилась, если чтение файла не удалось. При использовании assert вы должны заменить if на
assert(!file.rdstate());
и добавьте заголовок <cassert>
. Assert сгенерирует и завершит работу вашей программы, если значение file.rdstate()
равно 0 (интерпретируется как false
), так как вы хотите обратное - вначале отрицание.
Вы можете легко проверить эти концепции / идеи, просто указав несуществующее имя файла, но я также рекомендую вам этот пост для более подробного объяснения и тестирования идей, которые прояснят концепцию.