C++ 在解析文件时抛出 istream 特定错误

C++ Throwing istream specific errors when parsing a file

嗨,我的主要方法中有这一行:

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

这会将文件解析为向量。我已经覆盖了 std::istream << 运算符重载,并且正在寻找在解析失败时抛出特定错误消息的方法。这是 << 运算符重载:

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 的地方遇到字符串,它会抛出错误,反之亦然。

当输入操作失败时,在流上设置一个"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;
}

但是,除了 couting 之外,您还需要对错误的输入进行处理。如果您不打算只 "return",您将不得不跳过一行,或跳过一些字节,或做任何您认为合适的事情。也用std::cout.clear()清除错误状态,否则没有进一步的输入操作会成功。