文件中的最后一个字符是什么?

swo*_*itz 21 files

我刚刚阅读了在文件末尾删除换行符的答案,每个人都说要删除最后一个字符。我的问题是,eof 字符不是最后一个吗?

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换行符)结尾。文本编辑器可以处理所有可打印文本但缺少尾随换行符的文件。

  • [POSIX 定义](http://stackoverflow.com/a/729795/2738262) 文本文件作为包含一系列行的文件,而每一行又作为一系列非换行符,后跟一个换行符。因此,以除 0x0A 以外的任何内容结尾的文件不是符合标准的文本文件。 (11认同)
  • 我知道这一点,这就是为什么我指出 ** 文本编辑器** 工作的原因。(二进制文件没有这样的约束)。 (2认同)

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 字符确实被传送到输入缓冲区。


Mun*_*nir 7

EOF 不是字符。它是一种状态,表明不再需要从文件流中读取字符。当您从终端输入 EOF 命令时,您正在向操作系统发出信号以关闭输入流,而不是输入特殊字符。