EOF的功能问题

时间:2016-05-17 23:12:40

标签: c++ function c++11 char eof

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

以下是功能

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

下面列出的文件的内容

&#34;(空白行) 问:舌头对牙齿说了什么?&#34;

正如我所说,它显示的线条很好,但循环继续在问号后面。

有关为何会这样做的任何想法?此外,是否需要更多信息才能正确回答我的问题?

2 个答案:

答案 0 :(得分:1)

这样做的规范方法是:

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

表达式joke将评估为真,直到它达到EOF。我不确定您为什么要首先致电joke.clear()

答案 1 :(得分:1)

@Phil回答&#34;如何在C ++中做到这一点&#34;。我的回答是&#34;为什么会发生这种情况&#34;和&#34;如何在C&#34; (它仍然适用于C ++)。

由于ASCII表一直从1开始,我们有字节值0('\0')保留用于字符串终止(谈论C和C ++语言),因此EOF需要是一个特殊的价值。

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

char ch;

int ch;

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

cout << (char) ch;

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