我目前正在阅读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 回答
您需要生成实际的文件结尾,而不是输入
-1
.-1
不是文件的结尾,它是两个字符:'-'
和'1'
. 同时文件结尾不是任何字符,而是条件 . (作为一个类比:道路结束是一个条件,道路上的标志说“道路尽头”不是 . )在许多系统上,您可以通过按ctrl-D(Windows / DOS上的ctrl-Z)手动输入输入来生成和结束文件 . 或者,如果从文件管道输入(
./myprogram <file.txt
),则文件末尾会导致文件结束 .按
Ctrl-D
组合键 .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之后恰好仍然在内存中的随机附加数据 .