C ++ Throwing istream определен c ошибок при разборе файла - PullRequest
0 голосов
/ 08 апреля 2020

Привет У меня есть эта строка в моем основном методе:

std::copy(std::istream_iterator<Constituency>(inputFile), std::istream_iterator<Constituency>(), std::back_inserter(constits));

Это разбирает файл на вектор. Я перезаписал перегрузку оператора std::istream << и ищу способы генерирования определенных c сообщений об ошибках, если синтаксический анализ не удался. Вот перегрузка оператора <<: </p>

std::istream& operator>> (std::istream& input, Constituency& constituency) {

    int num_neighbours;
    input >> num_neighbours;
    std::string name;
    std::vector<int> neighbours(num_neighbours);

    for(int i = 0; i < num_neighbours; i++) {
        try{
            input >> neighbours[i];
        } catch(...) {
            std::cout << "Error: Int Neighbour" << std::endl;
        }
    }
    try{
        input >> name;
    } catch(...) {
        std::cout << "Error: Expected String Name" << std::endl;
    }

    constituency = Constituency(name, neighbours);

    return input;
}

Сообщения об ошибках не распечатываются. Как я могу изменить это так, что если встречается строка там, где ожидается int, она выдает ошибку и наоборот.

1 Ответ

1 голос
/ 08 апреля 2020

Когда операция ввода завершается неудачно, в потоке устанавливается «failbit».

Вы можете проверить это с помощью оператора if:

input >> neighbours[i];
if (!input) {
   std::cout << "Error: Int Neighbour" << std::endl;
}

Или:

if (!(input >> neighbours[i])) {
   std::cout << "Error: Int Neighbour" << std::endl;
}

Однако, помимо cout ing, вам также понадобится что-то сделать с этим плохим вводом. Если вы не планируете просто «вернуться», вам придется пропустить строку, пропустить некоторое количество байтов или сделать то, что вы считаете подходящим. Также очистите состояние ошибки с помощью std::cout.clear(), иначе дальнейшие операции ввода не будут успешными.

...