Ошибка чтения проверки ifstream - PullRequest
0 голосов
/ 29 июня 2018

Я нашел следующий код для чтения всего файла в строку. К сожалению, я не знаю, как правильно проверить, был ли загружен весь контент файла. Есть функция is_open, однако она не предоставляет всю информацию. Буду благодарен за любую помощь!

std::ifstream file(fileName);
std::string content = std::string((
  std::istreambuf_iterator<char>(file)),
  std::istreambuf_iterator<char>());

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Вы можете использовать утилиты 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), так как вы хотите обратное - вначале отрицание.

Вы можете легко проверить эти концепции / идеи, просто указав несуществующее имя файла, но я также рекомендую вам этот пост для более подробного объяснения и тестирования идей, которые прояснят концепцию.

0 голосов
/ 30 июня 2018

Вы ищете конец файла или флаг EOF.

Конец файла fliag

...