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

How can a C++ program know before executing a getline(in_file,my_string) that this call will be a read past end of file?

提问人:Michael 提问时间:5/22/2021 更新时间:5/22/2021 访问量:69

问:

这是(过度简化的)代码,它正在读取文件末尾。

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() 为 false,good() 为 true,则 getline 引发异常。我知道我可以更改它来处理异常,但是为什么 eof() 是假而 good() 是真的?

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

我正在使用 Ebarcadero 7.3 编译器。

欢迎任何和所有评论。

C++ EOF GetLine

评论

0赞 NathanOliver 5/22/2021
非常相关,也许是骗子:stackoverflow.com/questions/5605125/......
0赞 Nathan Pierson 5/22/2021
事实并非如此,这是内森所联系的问题的核心。
1赞 William Pursell 5/22/2021
在你阅读之前,你无法知道。这在理论上是不可能的。你必须阅读并看看发生了什么。
0赞 jamesdlin 5/22/2021
请参阅为什么“while ( !feof (file) )”总是错的? (这是一个 C 问题,但在这里也适用)。
0赞 Michael 5/22/2021
啊。。。我明白了 - 它不是真正的记录 IO。非常感谢。

答:

1赞 JaMiT 5/22/2021 #1

让我们想象一下,而不是计算机在阅读文件,而是在阅读一本书。让我们把它变成第二人称,这意味着我将这个假想的人称为“你”。:)

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

好吧,如果文本在页面中间结束(类似于最后一行不以行尾标记结尾),您可以看到文本已经结束。但是,如果文字一直走到页面末尾,你怎么知道下一页是否有文字,直到你翻页?这本书的末尾恰好有几页空白页,所以仅仅看剩下的厚度是不确定的。没有“The End”或其他标记表示书的结尾;文本一旦得出结论,就会结束。而且你对含义的理解不够好,无法识别结论。

这与实际情况很接近。你读到页面末尾; 读取到行尾标记。你和你都无法理解你所读的内容,所以你不能仅仅根据所读的内容来猜测文本是否已经完成。为了查看是否还有更多内容要阅读,您必须翻到下一页。为了看看是否还有更多要读的,不得不去下一行。如果这本书在一页的末尾结束,你不能宣布你已经完成了阅读,直到你尝试阅读一些不存在的东西。如果文件在一行末尾结束,则无法宣布它已完成读取,直到它尝试读取不存在的内容。getlinegetlinegetlinegetlinegetline

所以,正确。如果所有行都有行尾标记,则在尝试读取文件末尾之前,您将面临以下情况:在尝试读取文件末尾之前,没有任何指示表明您位于文件末尾。这些标志告诉您,在尝试读取文件末尾之前,流处于良好状态,并且尚未看到文件的末尾。您可能位于文件的末尾,但这还有待观察。

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

评论

0赞 David C. Rankin 5/22/2021
向创造力致敬:)