我为什么要两次阅读文件中的最后一个字?

时间:2015-10-16 21:51:21

标签: c++ file

我试图从文件中读取文本,这就是我正在做的事情:

int main(int argc, char* argv[])
{

ifstream inFile;
inFile.open(argv[1]);

string item;

while(inFile.good())
{
  inFile >> item;
  cout << item << " " << endl;
}

由于某种原因,它会两次读取文件中的最后一个单词。我尝试使用count变量来跟踪它进入while循环的次数,它总是输入的时间比文件中的总行数多一次。我认为这种情况正在发生,因为inFile.good()语句不会很快返回false。怎么能修好呢?

3 个答案:

答案 0 :(得分:3)

你没有测试

inFile >> item;

是否成功 - 在读取文件的最后一个单词时仍然有换行符或其他空格 - 所以你还没有到达文件结尾,但另一方面却没有还要读取更多的单词,因此最后一次读取失败,但您没有检测到它。

你可以测试>>作为bool表达式的成功,这应该有用;

if (inFile >> item)
   cout << item << " " << endl;

答案 1 :(得分:1)

最后一次读取失败,但你没有抓住它。变量只保留以前的值。

将您的循环更改为:

while(inFile >> item)
{
  cout << item << " " << endl;
}

答案 2 :(得分:0)

其他人已经展示了您应该编写的代码,因此我只是要解释您的代码无法正常工作的原因。

确实,

istream.good()&#34;很快就没有返回假。&#34;读完文件中的最后一项后,它仍然是真的。只有当您尝试读取文件的结束之后,它才会变为错误。

全部提出问题的各种方式&#34;我到达文件的末尾了吗?&#34;在C和C ++中具有相同的语义。这是因为底层OS原语read无法同时返回数据和信号EOF。