Tho*_*key 21
ASCII 控制字符具有 1960 年代的定义(实际上在您可能认为是网络之前)。并非所有这些控制字符都以当时为电信设备定义的方式使用。
在类 Unix 系统上,不需要EOF
字符;没有使用。系统可以告诉应用程序文件中有多少字节:
在其他一些系统上(在 VMS、DOS、Windows 中可见),control-Z 可能充当文件结束标记,因为在旧版本中,系统无法告诉某些应用程序文件中有多少字节。
在 VMS 的情况下,限制是由于 C 运行时的工作方式。汇编语言应用程序可以(并且确实)获得正确的文件大小。
shell中的 Unix 系统通常使用 control-D 来告诉应用程序已经到达输入(文件)的末尾,但 control-D 不存储在文件中。
在 C 中,EOF
故意-1
表示它不是有效字符。EOF
当检测到文件结束条件时,标准 I/O 返回——不是特殊字符。
顺便说一下,文件不需要以换行符(ASCII换行符)结尾。文本编辑器可以处理所有可打印文本但缺少尾随换行符的文件。
Joh*_*éen 17
文件不以文件结束字符结尾,正如前面的答案正确说明的那样。但我认为答案和评论包含一些值得指出的不准确之处:
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 使 read 系统调用返回一行字符给调用者一样。按照惯例,读取系统调用的返回值为零(即读取零字符)表示文件条件结束。但是,输入文件不会自动关闭,并且如果输入来自终端,则不会将其置于“文件结束”状态。您可以编写一个程序,即使在“文件结束”之后继续从终端读取,并且 read 调用可以为下一个输入行返回非零值。
eof 和 eol 字符之间的类比可以看到如果Ctrl-D在某些输入已经写在行上时按下- 。例如,如果您写入“abc”并按下Ctrl-D读取调用返回,这次返回值为 3 并且“abc”存储在作为参数传递的缓冲区中。由于 read 不返回 0,因此上述约定不会将其解释为 EOF 条件。同样,按 return 使 read 调用返回整个输入行(包括换行符)。您可以使用以下cat
命令进行尝试:在行上写一些字符并按Ctrl- D。您会看到字符回显给您并cat
等待更多输入。
以上所有仅适用于终端处于“cooked”模式时,而不是“raw”模式,在这种模式下,行输入处理被最小化。在原始模式下,Ctrl-D 字符确实被传送到输入缓冲区。
归档时间: |
|
查看次数: |
31844 次 |
最近记录: |