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