c++ - 如何使 getline 与 ios::exceptions 一起玩得很好?
问题描述
我正在尝试使用ifstream
我需要能够循环使用getline
但希望使用以下方法抛出异常ios::exceptions
:
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ifstream f;
f.exceptions( std::ifstream::failbit | std::ifstream::badbit );
try {
f.open("data/all-patents.dat", std::ifstream::in);
}
catch (std::ifstream::failure e) {
std::cout << "Caught exception opening: " << e.what() << "\n";
}
std::string l;
while (!std::getline(f, l).eof()) {
// do something
}
}
但是当getline
遇到 EOF 时,它会抛出一个异常:
terminate called after throwing an instance of 'std::__ios_failure'
what(): basic_ios::clear: iostream error
Program received signal SIGABRT, Aborted.
0x00007ffff7ad8615 in raise () from /usr/lib/libc.so.6
我可以通过抓住它来确认:
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ifstream f;
f.exceptions( std::ifstream::failbit | std::ifstream::badbit );
try {
f.open("data/all-patents.dat", std::ifstream::in);
}
catch (std::ifstream::failure e) {
std::cout << "Caught exception opening: " << e.what() << "\n";
}
std::string l;
try {
while (!std::getline(f, l).eof()) {
// do something
}
}
catch (std::ifstream::failure e) {
std::cout << "Caught exception reading: " << e.what() << "\n";
}
}
输出:Caught exception reading: basic_ios::clear: iostream error
ifstream::eofbit
尽管我没有使用inios::exceptions
的掩码,为什么 EOF 会引发异常?有没有一种方法可以让我继续使用ios::exceptions
而不必将我的while
循环包含在一个try
?
解决方案
您打开抛出异常failbit
,稍后当std::getline(f, l)
无法提取它将设置failbit
的触发异常的任何字符时。
推荐阅读
- c++ - mongocxx 驱动程序中的分段错误
- c# - C# 中等效的 GRG 非线性求解器
- javascript - 如何为网络图自定义颜色?
- sql - 列出系列中两个表之间的不同变体
- java - 每当我先输入更大的数字时,它都不会打印出任何东西
- c# - 在 C# 中,使用脚本将命令添加到 PowerShell InitialSessionState 并使其可从 C# 中发现
- python - 为什么这个结果比等效函数的另一个结果更准确
- html - 图像上的空白过多
- python - 检查数据框的值是否存在于另一个中,并以特定方式设置值以考虑重复项
- port - Mosquitto - 无法通过默认端口以外的网络连接