我目前正在阅读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?
感谢。
答案 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
)管道输入,则文件末尾会导致文件结束。