我知道 EOT 是 ASCII 代码 4,而 EOF 编码为 -1(至少在 C 中)。在我发现 EOF 映射到 -1 之前,我认为它只是 EOT 的同义词。为什么 EOF 映射为 -1 而不是 EOT?据我所知,它们都做同样的事情,即终止文件流。我能看出的唯一区别是 EOT 还会终止 bash shell 中的命令。我想要描述这两个代码之间的精确技术差异。
答案1
一般来说,EOF 不是一个字符;而是一个字符。这是一个角色的缺失。
如果程序在具有默认设置的规范模式的终端上运行(即仅使用 stdio 的纯 C 程序),它将永远不会看到 ASCII 字符 EOT。终端驱动程序识别该字符并创建一个 EOF 条件(在低级别是 0 返回值read()
)。 stdio 库将该 EOF 条件转换为适合相关函数的返回值(EOF
for 的宏getchar()
、 的空指针fgets()
等)
除了在 C 库中之外,宏的数值EOF
在任何地方都没有相关性,并且它不应该影响您对 EOF 条件含义的理解。
答案2
EOF
在 C 的上下文中只是不能出现在文件中的东西。EOT
是一个 ASCII 字符,过去表示消息结束(并且是 UNIX 终端中的特殊字符,表示流结束当它仅出现在用户输入中时),但它可以出现在文件中,因此在读取二进制文件时,在 C 中使用它来表示文件结束将是一个糟糕的主意!
答案3
EOT 是串行设备使用的众多控制字符之一。还有许多其他控制字符与通过串行线路传输数据或在串行源(如纸带)上存储文件有关。其中包括 SOH、STX、ETX、FS、RS、GS 和 US 等字符。附加控制字符用于传输控制和纠错。
在串行连接上,EOT(传输结束)字符表示希望结束传输。串行连接通常使用文件驱动程序进行访问。当串行传输结束时,文件驱动程序将其报告为 EOF(文件结束)条件。
EOF 不是一个字符。 getchar() 返回一个整数。有效字符 while 的值范围为 0 到 255。值 -1 通常在 Unix/Linux 上用作 false/invalid/fail 指示符。 (实际上是一个非 0 值,因为有很多原因不成功,但通常只有一种成功情况。)当 getchar() 返回 -1 时,它显然没有返回字符。但是,如果将输出存储在字节中,则将无法区分 EOF 和 DEL(删除)字符。