EOF 的功能问题

Function trouble with EOF

我有一个函数应该逐个字符地读取文件并输出到控制台,直到它到达 EOF。该功能可以很好地显示我想要的所有字符,但它会继续运行,并且永远不会在最后停止。

下面是函数

 void displayAllLines(ifstream &joke)
 {
    char ch;
    joke.clear();
    ch = joke.get();
    while (ch != EOF)
    {
        cout << ch;
        ch = joke.get();
    } 
 }

下面列出的文件的内容

”(空行) 问:舌头对牙齿说了什么?

正如我所说,它显示该行很好,但在问号之后循环继续。

想知道为什么会这样吗?另外,是否需要更多信息才能正确回答我的问题?

规范的做法是:

 void displayAllLines(ifstream &joke)
 {
    char ch;
    while (true)
    {
        ch = joke.get();
        if (joke) {
             cout << ch;
        } else {
             break;
        }
    } 
 }

表达式 joke 的计算结果为真,直到遇到 EOF。我不确定您为什么要先致电 joke.clear()

@Phil 回答了 "how to do this in C++"。我的答案进入 "why is this happening" 和 "how to do this in C"(它仍然适用于 C++)。


由于 ASCII table 从 1 一直向上,我们有字节值 0 ('[=13=]') 保留用于字符串终止 (谈论 C 和 C++ 语言), EOF需要是它之外的一个特殊值。

这就是为什么 getchar()ifstream::get() return 一个 int,而不是 char。所以你需要做的就是改变

char ch;

int ch;

并将其转换为 char 以进行打印:

cout << (char) ch;

从技术上讲,EOF 通常是 -1。您的 char 的范围可能是 0 - 255,这意味着它永远不会等于 -1。启用了 -Wall 的体面的编译器应该至少给你一个警告。