我正在编写一个方法,从格式如下的文件中读取项目:
[String] [Integer] [Double]
[String] [Integer] [Double]
我从文件中阅读,并使用以下循环将每行存储到一个vector中,作为用户定义的类型:
while(ifs.good()){
Car car;
ifs >> car.carName;
ifs >> car.yearBuilt;
if(!ifs.good()) throw std::invalid_argument("Year must be a integer");
ifs >> car.price;
if(!ifs.good())
throw std::invalid_argument("Price must be a double");
to_return.push_back(car);
}
然而,尽管文件格式正确,字段正确,函数仍不断抛出错误,说“价格必须是双精度”。下面是我使用的一个测试文件:
奔驰1998 2364.12
奥迪2012 32645.79
如果我删除if语句,文件将被正确解析,向量将按预期工作。我不明白为什么会抛出这个错误,以及为什么在解析double后文件状态处于fail()状态时会自行修复。
2条答案
按热度按时间34gzjxbg1#
.good()
在很多时候检查流是错误的,因为它还检查eof
标志是否被设置,即文件的结尾是否已被某些先前的操作到达。通常,阅读
double
不会设置eof
标志,因为文本文件应该以\n
结尾,所以我们在读取时会找到换行符而不是EOF。然而,并不是每个文本文件都被正确地终止(包括你的,显然),我们在阅读2364.12
时遇到了EOF。理想情况下,您的代码应该能够处理不以换行符结尾的文本文件。如果我们正确处理错误,这是可能的。大多数时候,你应该:
1.尝试执行某些I/O操作
1.检查
.fail()
是否设置成功C++流可以上下文转换为
bool
,这隐式检查.fail()
标志。因此,我们可以写:nkcskrwz2#
至少在我看来,如果你想从一个文件中读取
car
对象,最好为car
对象重载operator>>
:有了这个,你就可以用这样的代码读取汽车对象的向量: