首页 文章

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

提问于
浏览
0

我目前正在阅读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 . 但是正如你所看到的那样,它仍然没有't end. Is that because EOF' s -1是int,而我输入的-1是char?我不确定 .

那么我如何实际使用EOF?

谢谢 .

3 回答

  • 3

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

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

  • 2

    Ctrl-D 组合键 .

  • 2

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

    在Unix系统的终端上,键入Ctrl D以使 stdin 报告已到达文件末尾,这会导致 getchar() 返回 EOF . 在Windows上的命令提示符下,键入Ctrl Z以获得相同的效果 . 这些字符由OS(在输入设备驱动程序中)解释,以允许手动输入 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之后恰好仍然在内存中的随机附加数据 .

相关问题