微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 程序如何在执行 getline(in_file,my_string) 之前知道此调用将是读取文件末尾?

如何解决C++ 程序如何在执行 getline(in_file,my_string) 之前知道此调用将是读取文件末尾?

这是读取文件末尾的(过度简化的)代码

std::ifstream in_file;
in_file.open(argv[1],ios::in);

getline(in_file,line_any);
while (!in_file.eof())
    {
     record_count++;
    //:
    //: lots of stuff
    //:
    std::cout << "before getline " << line_any << "   >" << in_file.eof() << "   >" << in_file.good() << "  \n";
    getline(in_file,line_any);
    std::cout << " after getline " << line_any << "   >" << in_file.eof() << "   >" << in_file.good() << "  \n";
    }

就在 getline() 之前,eof() 为假而 good() 为真,然后 getline 引发异常。我知道我可以改变它来处理异常,但为什么 eof() 是假的而 good() 是真的?

这是一个线索。 如果输入文件的最后一行有回车和换行,则发生异常。如果最后一行没有 CRLF,则不会引发异常。

我使用的是 Ebarcadero 7.3 编译器。

欢迎任何和所有评论

解决方法

让我们想象一个人在读一本书,而不是计算机读取文件。让我们将其设为第二人称,这意味着我会将这个假设的人类称为“你”。 :)

所以您正在阅读一本书,但这本书对您来说没有多大意义。你阅读一页,思考它,然后重复。现在试着一步一步地想象正在发生的事情。你到达一页的末尾,你可以看到两页中的第二页,这本书平放着。你考虑一下。这没有意义。还有更多要读的吗?

好吧,如果文本在页面中间结束(类似于最后一行不以行尾标记结束),您可以看到文本已经结束。但是,如果文字一直走到页尾,那么在翻页之前如何知道下一页是否还有文字呢?这本书刚好有几页空白页,所以只看剩下的厚度是不确定的。没有“The End”或其他表明本书结束的标记;案文一到结论就结束。并且您对含义的理解不够深入,无法识别结论。

这与 getline 所做的很接近。你读到了页面的末尾; getline 读取到行尾标记。您和 getline 都无法理解您阅读的内容,因此您无法仅根据阅读的内容来猜测文本是否已完成。为了查看是否还有更多内容要阅读,您必须翻到下一页。为了查看是否还有更多内容要阅读,getline 必须转到下一行。如果这本书在一页结束时结束,则在您尝试阅读不存在的内容之前,您无法宣布您已阅读完毕。如果文件在行尾结束,getline 无法宣布它已完成读取,直到它尝试读取不存在的内容。

所以,正确。如果您的所有行都有行尾标记,那么您将面临这样一种情况:在您尝试越过文件末尾阅读之前,没有任何迹象表明您位于文件末尾。这些标志告诉您,在尝试读取文件末尾之前,流处于良好状态并且尚未看到文件末尾。您可能在文件的末尾,但仍有待观察。

是的,有可能以不同的方式实现阅读。然而,展望未来是语言设计者不想强加于 getline 的额外开销。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。