找到cin和ifstream的流末尾?

use*_*219 7 c++ cin istream ifstream eof

我正在运行一本C++教科书,我将其作为C++编程的复习.其中一个练习问题(没有太多细节)希望我定义一个可以传递ifstream或cin(例如istream)作为参数的函数.从那里,我必须通读流.麻烦的是,我无法想出一个办法能有这个一个功能使用cin和ifstream的有效发现流的末尾.也就是说,

while(input_stream.peek() != EOF)
Run Code Online (Sandbox Code Playgroud)

不会为cin工作.我可以重新修改函数来查找某个短语(比如"#End of Stream#"等),但我认为如果我传递的文件流有这个确切的短语,这是一个坏主意.

我曾经想过要使用函数重载,但到目前为止,本书已经提到它何时需要我这样做.我可能在这个实践问题上投入了太多精力,但我喜欢这个创作过程并且好奇是否有这样的方法可以做到这一点而不会超载.

atz*_*tzz 6

eof() 确实适用于cin.你做错了什么; 请发布您的代码.一个常见的障碍是,您尝试在流末尾读取,eof标记会被设置.

这是一个演示:

#include <iostream>
#include <string>

int main( int, char*[] )
{
    std::string s;
    for ( unsigned n = 0; n < 5; ++n )
    {
        bool before = std::cin.eof();
        std::cin >> s;
        bool after = std::cin.eof();
        std::cout << int(before) << " " << int(after) << "  " << s << std::endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

及其输出:

D:>t
aaaaa
0 0  aaaaa
bbbbb
0 0  bbbbb
^Z
0 1  bbbbb
1 1  bbbbb
1 1  bbbbb
Run Code Online (Sandbox Code Playgroud)

(在Windows上使用Ctrl-Z生成EOF,在许多其他操作系统上使用Ctrl-D生成)