为什么EOF(文件末尾)在没有'\ n'之前的行尾没有工作?

时间:2014-06-30 11:58:16

标签: c input eof

所以我开始使用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)char是某种结束流的信号,它必须在getchar()的新行上才能返回EOF。虽然这一切都很好,但它有点帮助我真的想知道为什么EOF必须独立?

2 个答案:

答案 0 :(得分:4)

您遇到的问题与命令行终端有关,与文件结束标记本身无关。在您输入字符时,大多数终端都会等到您完成整行后才将其输入的内容发送到程序中。

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

./myprogram.exe < input.txt

顺便说一下,你链接的答案也指出EOF不是你输入流中实际存在的字符,因此在&#34;之前没有办法来#34; a&#34; \ n&#34;。 EOF只是在没有剩余字符要读取时getchar返回的值。

答案 1 :(得分:3)

当从tty设备读取时(例如在控制台或终端窗口中运行的程序的stdin),终端处于所谓的cooked mode。在此模式下,提供了某种级别的行编辑工具,允许用户退格并更改已键入的内容。

在按下return之前,键入的字符不会返回到程序。

可以通过将终端设置为“原始”模式来完成此操作。不幸的是,它似乎没有很好地标准化,所以它有点系统特定。 this question的答案有各种平台的例子。