EOF功能故障

Function trouble with EOF

本文关键字:功能故障 EOF      更新时间:2023-10-16

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

以下是的功能

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

下面列出的文件内容

"(空行)Q: 舌头对牙齿说了什么?"

正如我所说,它显示的行很好,但循环一直在问号后面。

有什么想法吗?此外,是否需要更多的信息来正确回答我的问题?

实现这一点的规范方法是:

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

表达式joke将计算为true,直到它达到EOF为止。我不知道你为什么要先打给joke.clear()

@Phil回答了"如何在C++中做到这一点"。我的答案是"为什么会发生这种情况"answers"如何在C中做到这一点"(它在C++中仍然有效)。


由于ASCII表从1一直向上,并且我们为字符串终止保留了字节值0('')(使用C和C++语言),因此EOF需要是它之外的一个特殊值。

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

char ch;

int ch;

并将其铸造成焦炭进行打印:

cout << (char) ch;

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