使用getline()而不设置failbit
Use getline() without setting failbit
是否可以使用getline()
读取有效文件而不设置failbit
?我想使用failbit
,以便在输入文件不可读时生成异常。
下面的代码总是输出basic_ios::clear
作为最后一行—即使指定了有效的输入。
test.cc:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
ifstream inf;
string line;
inf.exceptions(ifstream::failbit);
try {
inf.open(argv[1]);
while(getline(inf,line))
cout << line << endl;
inf.close();
} catch(ifstream::failure e) {
cout << e.what() << endl;
}
}
input.txt:
the first line
the second line
the last line
结果:
$ ./a.out input.txt
the first line
the second line
the last line
basic_ios::clear
你不能。标准规定getline
:
如果函数没有提取字符,它调用
is.setstate(ios_base::failbit)
,可能抛出ios_base::failure
(27.5.5.4)。
如果你的文件以空行结束,即最后一个字符是'n',那么最后一次调用getline不读取字符并失败。实际上,如果不设置failbit,您希望如何终止循环呢?while
的条件总是为真,它将永远运行。
try {
ifstream inf(argv[1]);
if(!inf) throw SomeError("Cannot open file", argv[1]);
string line;
while(getline(inf,line))
cout << line << endl;
inf.close();
} catch(const std::exception& e) {
cout << e.what() << endl;
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- 为什么即使输入有效,也总是设置 cin.failbit
- 使用getline()而不设置failbit
- istream提取没有明显原因地设置failbit
- Ifstream在读取文本文件时设置failbit
- 在c++中执行getline函数调用时,何时设置failbit ?
- 为什么设置了failbit()