首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我要将文件中的最后一个单词读两次?

为什么我要将文件中的最后一个单词读两次?
EN

Stack Overflow用户
提问于 2015-10-17 05:51:21
回答 3查看 4.2K关注 0票数 2

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

代码语言:javascript
运行
复制
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。如果是这样的话怎么解决呢?

EN

回答 3

Stack Overflow用户

发布于 2015-10-17 05:54:24

您并不是在测试

代码语言:javascript
运行
复制
inFile >> item;

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

您可以将>>作为布尔表达式测试是否成功,这应该是可行的;

代码语言:javascript
运行
复制
if (inFile >> item)
   cout << item << " " << endl;
票数 3
EN

Stack Overflow用户

发布于 2015-10-17 05:54:28

最后一次读取失败,但您没有捕捉到它。该变量只保留先前的值。

将您的循环更改为:

代码语言:javascript
运行
复制
while(inFile >> item)
{
  cout << item << " " << endl;
}
票数 1
EN

Stack Overflow用户

发布于 2015-10-17 06:00:11

其他人已经展示了您应该编写的代码,所以我将解释为什么您的代码不能工作。

实际上,istream.good()“不会很快返回false”。在你读完文件中的最后一项后,它仍然是真的。只有当您试图读取超过文件末尾的一个项目时,它才会变为false。

问“我已经到文件末尾了吗?”的各种方式。C和C++具有相同的语义。这是因为底层操作系统原语read不能同时返回数据和信号EOF。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33180098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档