提问人:Michael 提问时间:5/22/2021 更新时间:5/22/2021 访问量:69
在执行 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?
问:
这是(过度简化的)代码,它正在读取文件末尾。
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 编译器。
欢迎任何和所有评论。
答:
让我们想象一下,而不是计算机在阅读文件,而是在阅读一本书。让我们把它变成第二人称,这意味着我将这个假想的人称为“你”。:)
所以你正在读一本书,但这本书对你来说没有多大意义。你读一页,想一想,然后重复。现在试着一步一步地想象正在发生的事情。你到达了一页的末尾,你可以看到两页中的第二页,书是平放的。你想想看。这没有意义。还有什么要读的吗?
好吧,如果文本在页面中间结束(类似于最后一行不以行尾标记结尾),您可以看到文本已经结束。但是,如果文字一直走到页面末尾,你怎么知道下一页是否有文字,直到你翻页?这本书的末尾恰好有几页空白页,所以仅仅看剩下的厚度是不确定的。没有“The End”或其他标记表示书的结尾;文本一旦得出结论,就会结束。而且你对含义的理解不够好,无法识别结论。
这与实际情况很接近。你读到页面末尾; 读取到行尾标记。你和你都无法理解你所读的内容,所以你不能仅仅根据所读的内容来猜测文本是否已经完成。为了查看是否还有更多内容要阅读,您必须翻到下一页。为了看看是否还有更多要读的,不得不去下一行。如果这本书在一页的末尾结束,你不能宣布你已经完成了阅读,直到你尝试阅读一些不存在的东西。如果文件在一行末尾结束,则无法宣布它已完成读取,直到它尝试读取不存在的内容。getline
getline
getline
getline
getline
所以,正确。如果所有行都有行尾标记,则在尝试读取文件末尾之前,您将面临以下情况:在尝试读取文件末尾之前,没有任何指示表明您位于文件末尾。这些标志告诉您,在尝试读取文件末尾之前,流处于良好状态,并且尚未看到文件的末尾。您可能位于文件的末尾,但这还有待观察。
是的,有可能以不同的方式实现阅读。然而,展望未来是语言设计者不想强加给 getline
的额外开销。
评论
:)
评论