C++在分析文件时引发istream特定错误



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

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

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

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之外,您还需要对那个糟糕的输入做些什么。如果你不打算只"返回",你将不得不跳过一行,或者跳过一些字节数,或者做任何你认为合适的事情。还要使用std::cout.clear()清除错误状态,否则将不会成功执行进一步的输入操作。

最新更新