Answers:
文件没有以文件结尾字符结尾,因为前面的答案正确指出。但我认为答案和评论包含一些不正确之处,值得指出:
ASCII字符集不包含确切的EOF字符。有几个“结束”控制字符:文本结尾(3),传输结尾(4),传输块结尾(23),媒体结尾(25)。文件分隔符(28)可能最接近EOF字符。代码26是“替代”,不是EOF。
Ctrl- D仅与终端输入关联。例如,该命令
cat filea fileb filec > outfile
不包含Ctrl- D。顺便说一句,您可以使用命令将终端EOF字符更改为Ctrl- 以外的其他字符。Dstty
严格来说,Ctrl- D(或您更改的任何内容)不是EOF密钥代码。它所做的是使read
系统调用返回带有可用输入的内容,就像按return使读取的系统调用将一行字符返回给调用者一样。按照惯例,读取的系统调用的返回值为零(即读取的零字符)表示文件状态结束。但是,输入文件不会自动关闭,并且,如果输入来自终端,则不会处于“文件末尾”状态。您可以编写一个程序,即使在“文件结束”之后,该程序也可以继续从终端读取数据,并且读取调用对于下一个输入行可以返回非零值。
如果已经在行上写入了某些输入,则按Ctrl- 可以看到eof和eol字符之间的类比D。例如,如果您写入“ abc”,然后按press Ctrl- Dread调用将返回,这一次返回值为3,并且将“ abc”存储在作为参数传递的缓冲区中。由于read不返回0,因此上述约定不会将其解释为EOF条件。类似地,按回车键将使读调用返回整个输入行(包括换行符)。您可以使用以下cat
命令进行尝试:在行上写一些字符,然后按Ctrl- D。您会看到字符回显给您,并cat
等待更多输入。
以上所有内容仅适用于终端处于“ cooked”模式(与“ raw”模式相对)的情况,在该模式中,线路输入处理被最小化。在原始模式下,Ctrl-D字符实际上会传递到输入缓冲区。
ASCII控制字符具有1960年代的定义(实际上是在您可能认为是网络之前)。并非所有这些控制字符都以当时为电信设备定义的方式使用。
在类似Unix的系统上,不需要EOF
字符。没有使用。系统可以告诉应用程序文件中有多少字节:
在某些其他系统(在VMS,DOS,Windows中可见)上,control-Z可能充当文件结尾标记,因为在较旧版本中,系统无法告诉某些应用程序文件中有多少字节。
对于VMS,限制是由于C运行时的工作方式引起的。汇编语言应用程序可以(并且确实)获得正确的文件大小。
外壳程序中的Unix系统通常使用control-D来告知应用程序已到达输入(文件)的末尾,但是control-D未存储在文件中。
在C中,EOF
故意-1
表示它不是有效字符。EOF
检测到文件结束条件时返回标准I / O ,而不是特殊字符。
顺便说一句,文件不必以换行符(ASCII 换行符)结尾。文本编辑器可以处理都是可打印文本但没有尾随换行符的文件。
busybox
的最小编辑器vi
等)。
EOF不是字符。它是一种状态,指示不再需要从文件流中读取字符。从终端输入EOF命令时,您正在向OS发送信号以关闭输入流,而不用输入特殊字符。
bash
获得输入之前,由TTY驱动程序对其进行按摩。该驱动程序拦截Ctrl-D并将EOF发送给bash
(其中EOF不是字符,而是特殊文件状态)