EOF和结束程序有什么特点?

时间:2013-11-16 22:21:54

标签: c

我目前正在阅读C编程语言(第1版)。在1.5节中,在文件复制下,书籍介绍了EOF的概念。

#define EOF -1

main()
{
    int c;

    c = getchar();
    while (c != EOF)
    {
        putchar(c);
        c = getchar();
    }
}

当我运行上面的程序时,程序接受输入并再次输出输出。

omfg
omfg
how
how
do 
do 
i end 
i end 
this?
this?
-1
-1

我原以为打字-1会结束该计划,因为EOF是-1。但是如你所见,它仍然没有结束。是因为EOF的-1是int,而我输入的-1是char?我不确定。

那么我如何实际使用EOF?

感谢。

3 个答案:

答案 0 :(得分:3)

EOF不是一个角色;相反,它是一个流的条件。因此,一次处理输入流一个字符的代码可以轻松检测到文件结束条件,函数getchar()被定义为返回int而不是char,并返回检测到输入结束时的信号值EOF

在Unix系统的终端上,键入 Ctrl + D 以使stdin报告已到达文件末尾,这会导致{{ 1}}返回getchar()。在Windows上的命令提示符下,键入 Ctrl + Z 以获得相同的效果。操作系统(在输入设备驱动程序中)解释这些字符,以允许手动输入EOF条件。

当您的程序从文件而不是终端读取时,EOF条件将在读取文件的最后一个字符后自然出现。在Unix中,您可以从文件中读取任何字符,包括Ctrl + D字符,而不会触发文件结束条件,因为从文件读取不涉及执行该转换的tty设备驱动程序。

类似地,当将一个程序的输出连接到一秒时,第二个将在第一个关闭其输出流时看到EOF,而不是仅仅因为Ctrl + D在数据中而看到EOF。

请注意,在Windows下,某些C编译器和文件处于“文本”模式时,读取Ctrl + Z字符会导致文件过早结束。这是出于历史原因:Windows从DOS中借用了很多行为,而从CP / M-80中借用了DOS。在CP / M-80中,文件系统仅以“块”为单位知道文件的大小(每块512字节)。为了使文本文件干净利落,选择Ctrl + Z字符不太可能是文档的有效部分,并用于表示文本文件的结尾。磁盘上文件的末尾将是一个在其中包含至少一个Ctrl + Z字符的块,并且通常包含在Ctrl + Z之后恰好仍然在内存中的随机附加数据。

答案 1 :(得分:2)

Ctrl-D组合键。

答案 2 :(得分:2)

您需要生成实际的文件结尾,而不是键入-1-1不是文件的结尾,而是两个字符:'-''1'。同时文件结尾不是任何字符,而是条件。 (作为一个类比:道路结束是一个条件,道路上的标志说“道路尽头”不是。)

在许多系统上,按ctrl-D(Windows / DOS上的ctrl-Z)手动输入输入时,可以生成和结束文件。或者,如果您从文件(./myprogram <file.txt)管道输入,则文件末尾会导致文件结束。