【发布时间】:2015-02-03 13:09:37
【问题描述】:
我给出了一个答案,我想每次通过循环here检查流的有效性。
我的原始代码使用了good,看起来类似于:
ifstream foo("foo.txt");
while (foo.good()){
string bar;
getline(foo, bar);
cout << bar << endl;
}
我立即被指向here,并被告知永远不要测试good。显然这是我不明白的事情,但我想正确地执行我的文件 I/O。
我用几个示例测试了我的代码,但无法使good-testing 代码失败。
首先(打印正确,以新行结尾):
屏蔽 1
出血 1 2
废话
换行结束
第二个(打印正确,以最后一行结尾):
阻止 1
出血 1 2
废话
这不会以新行结束
第三个是一个空文件(打印正确,一个换行符。)
Fourth 是一个丢失的文件(这正确地没有打印任何内容。)
谁能帮我举个例子来说明为什么 good-testing 不应该做?
【问题讨论】:
-
你应该改用
while (getline(foo, bar)) {..}。 -
@NeilKirk 这真的取决于偏好。对循环条件使用
getline将不会为空文件输出任何内容,并截断最后一个尾随换行符。因此示例 2 和示例 3 会以不同的方式打印。如果 n 是文件中\ns 的数量,那么我个人的偏好是文件被表示为具有 n + 1 行。 Nathan Oliver 的答案中的 cmets 在一定程度上解决了这个问题。 -
我假设您不想要额外的新行输出。如果你这样做,它看起来是正确的。
标签: c++ file-io stream filestream