【问题标题】:Function trouble with EOFEOF 的功能问题
【发布时间】:2016-09-14 05:38:35
【问题描述】:

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

下面是函数

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

下面列出的文件内容

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这样做的规范方法是:

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

    表达式joke 将评估为真,直到它到达 EOF。我不知道你为什么要先打电话给joke.clear()

    【讨论】:

    • 这只是我从文件开始时被教导的一个习惯。只需确保一开始就没有标志。你认为它没有意义,或者你认为它可能对程序有害吗?编辑:: 至于您发布的代码,它肯定会进一步推进程序,但不考虑空格字符,并显示没有空格的所有内容
    • 另外,如果您有任何想法,为什么我的代码不起作用工作。
    • 我不认为你应该盲目地打电话给clear()。如果设置了标志,那么这将是有原因的,简单地清除它们将无济于事。您的代码不起作用,因为 C++ 流不像 C 那样将 EOF 读取为字符。 C++ 流读取字符直到它们到达 EOF。 (它们实际上从不返回 EOF 字符——那是 C 的东西。)
    • 为什么贴出来的代码会跳过空格?我不明白为什么无法识别空格字符。
    • 对不起。我习惯于阅读字符串而不是字符。 joke &gt;&gt; str 将跳过空格(这是我大部分时间所做的)。我更新了答案以使用joke.get(),就像您在问题中所做的那样。
    【解决方案2】:

    @Phil 回答“如何在 C++ 中做到这一点”。我的回答是“为什么会发生这种情况”和“如何在 C 中做到这一点”(它仍然适用于 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 的体面编译器应该至少会给您一个警告。

    【讨论】:

    • 更一般地,使用std::istream::traits_type::int_type 代替int。这适用于所有字符编码,而不仅仅是 ASCII。
    猜你喜欢
    • 2020-09-12
    • 2011-08-11
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2016-03-09
    • 2018-10-23
    相关资源
    最近更新 更多