我正在尝试从文件中读取文本,这就是我正在做的事情:
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。如果是这样的话怎么解决呢?
发布于 2015-10-17 05:54:24
您并不是在测试
inFile >> item;是成功的--在读取文件的最后一个单词时,仍然有一个换行符或其他空格--所以您还没有到达文件末尾,但另一方面,也没有更多的单词要读取,所以最后一次读取失败,但是您没有检测到它。
您可以将>>作为布尔表达式测试是否成功,这应该是可行的;
if (inFile >> item)
   cout << item << " " << endl;发布于 2015-10-17 05:54:28
最后一次读取失败,但您没有捕捉到它。该变量只保留先前的值。
将您的循环更改为:
while(inFile >> item)
{
  cout << item << " " << endl;
}发布于 2015-10-17 06:00:11
其他人已经展示了您应该编写的代码,所以我将解释为什么您的代码不能工作。
实际上,istream.good()“不会很快返回false”。在你读完文件中的最后一项后,它仍然是真的。只有当您试图读取超过文件末尾的一个项目时,它才会变为false。
问“我已经到文件末尾了吗?”的各种方式。C和C++具有相同的语义。这是因为底层操作系统原语read不能同时返回数据和信号EOF。
https://stackoverflow.com/questions/33180098
复制相似问题