【问题标题】:Why EOF(end of file) isn't working at the end of a line without a '\n' before it?为什么 EOF(end of file) 不能在没有 '\n' 的行尾工作?
【发布时间】:2014-08-20 19:05:21
【问题描述】:

所以我开始使用 ANSI C 书来学习 C。本书的早期练习之一是编写一个程序,该程序接受文本输入并将每个单词打印在新的一行,非常简单。所以我做到了:

#include <stdio.h>

#define IN 1
#define OUT 0

 main() { 

    int c;
    int state;

    state = OUT;

    while((c = getchar()) != EOF){
        if(c != ' ' && c != '\n' && c != '\t'){
            state = IN;
        }else if(state == IN){
            state = OUT;
            putchar('\n');
        }
        if(state == IN)
            putchar(c);
    }

     getchar();
 }

问题是,虽然程序运行良好,但如果我输入 EOF(Windows 上的 Ctrl+Z) 作为一行的最后一个字符或在它的中间,它不会中断 while 循环。

所以我找到了答案here

我学到的是 (Ctrl+Z) 字符是结束流的某种信号,它必须位于新行上,getchar() 才能返回EOF。虽然这一切都很好,而且有点帮助,但我真的很想知道为什么 EOF 有必要独立运行?

【问题讨论】:

  • 几周前我们有一个类似的问题,我找不到任何参考资料。但据我所知,对于大多数类 UNIX 终端来说,^D 刷新输入缓冲区,如果刷新,则发送 EOF;换行符也会刷新缓冲区。也许这对于 Windows 也是一样的(使用 ^Z 而不是 ^D)?
  • 另请注意,您的最后一个 getchar(); 永远无法读取任何内容(当您退出循环时,最后一个 getchar 调用返回 EOF)。
  • @mafso 最后一个getchar() 用于保持控制台打开,仅此而已。
  • 这行得通(只是出于好奇,我不熟悉 Windows 控制台)?

标签: c input eof


【解决方案1】:

您遇到的问题与您的命令行终端有关,与文件标记本身的结尾无关。大多数终端不会在您键入字符时将字符发送到程序,而是会等到您完成一整行后再将您键入的内容发送到程序。

您可以通过让输入来自文本文件而不是手动输入来测试这一点。您应该能够在没有任何问题的情况下结束输入文件。

./myprogram.exe < input.txt

顺便说一句,您链接到的答案还指出 EOF 不是您输入流中实际存在的字符,因此它无法“在”“\ n”之前出现。 EOF 就是getchar 在没有字符可读取时返回的值。

【讨论】:

  • 是的,我知道EOF 不是字符我没有得到的是为什么我不能在行尾使用(Ctrl+Z) ti 信号getchar() 来返回@987654325 @,你的回答从那时起,现在我可以放松并继续阅读这本书,而不会因为这个问题而伤脑筋!谢谢。
【解决方案2】:

当从 tty 设备(例如在控制台或终端窗口中运行的程序的标准输入)读取时,终端位于所谓的cooked mode 中。在这种模式下,提供了一定程度的行编辑功能,允许用户退格并更改已键入的内容。

在按下返回键后,输入的字符才会返回到程序中。

可以通过将终端置于“原始”模式来做到这一点。不幸的是,这似乎没有很好的标准化,所以它在某种程度上是系统特定的。 this question 的答案有一些针对各种平台的示例。

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2022-06-14
    相关资源
    最近更新 更多