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;
}
但是,除了 cout
ing 之外,您还需要对错误的输入进行处理。如果您不打算只 "return",您将不得不跳过一行,或跳过一些字节,或做任何您认为合适的事情。也用std::cout.clear()
清除错误状态,否则没有进一步的输入操作会成功。
嗨,我的主要方法中有这一行:
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;
}
但是,除了 cout
ing 之外,您还需要对错误的输入进行处理。如果您不打算只 "return",您将不得不跳过一行,或跳过一些字节,或做任何您认为合适的事情。也用std::cout.clear()
清除错误状态,否则没有进一步的输入操作会成功。