至于所有文件的末尾,特别是文本文件,有 EOF 或 NULL 字符的Hex代码。当我们想要编写程序并读取文本文件的内容时,我们发送读取函数,直到我们收到该EOF十六进制代码。
我的问题:我下载了一些工具来查看文本文件的十六进制视图。但我看不到 EOF (文件结束/空)或 EOT (文字结尾)的任何十六进制代码
ASCII /十六进制代码表:
这是Hex查看器工具的输出:
注意:我的输入文件是一个文本文件,其内容为"其中十六进制代码为" EOF"?"
感谢您的时间和考虑。
答案 0 :(得分:35)
There is no such thing as a EOF character。操作系统确切地知道文件包含多少字节(这与其他元数据一起存储,如权限,创建日期和名称),因此可以告诉尝试读取十字节文件的第十一个字节的程序:你已经到达文件末尾,没有更多的字节要读。
实际上,例如getchar
之类的C函数返回的“EOF”值明确地是一个字节范围之外的int
值,因此它不可能存储在文件中!
有时,某些文件格式坚持添加NUL终止符(可能因为字符串通常存储在C中),但通常这些格式会在单个文件中划分多个记录,而不是整个文件。而这样的装饰通常会使文件被视为“文本文件”。
像ETX和NUL这样的ASCII代码可以追溯到电传打字机和朋友的日子。 NUL在C中用于内存中字符串,但这与文件系统无关。
答案 1 :(得分:16)
很久很久以前 - End Of File 标记,但多年来一直没有在文件中使用过。
您可以使用以下方式在Windows上演示它的远程回声:
C:\>copy con junk.txt
Hello
Hello again
- Press <Ctrl> and <z>
C:\>dump junk.txt
junk.txt:
00000000 4865 6c6c 6f0d 0a48 656c 6c6f 2061 6761 Hello..Hello aga
00000010 696e 0d0a in..
C:\>
请注意使用Ctrl-Z
作为EOT标记。
但是,请注意Ctrl-Z
不再出现在文件中 - 它过去只显示为0x1a
,但仅限于某些操作系统,甚至不一致。
ETX
(0x03
)的使用甚至在那些昏暗和遥远的时期之前就停止了。
答案 2 :(得分:7)
没有EOF这样的东西。 EOF只是文件读取函数返回的值,用于告诉您文件指针到达文件末尾。
答案 3 :(得分:1)
曾经有过不同的EOF字符(针对不同的操作系统)。不再见了一个。 (通常文件是128字节的块。)用于编码PITA,就像现在的BOM一样。
相反,仍有一个int read()
通常会传递一个字节值,但是对于EOF传递-1。
NUL字符是C中的字符串终止符。在java中,您可以在字符串中间使用NUL字符。为了与C协作,生成的UTF-8字节对Unicode字符&gt;使用多字节编码。 127和NUL。
(其中一些可能已经知道了。)
答案 4 :(得分:1)
今天,unix tty终端使用0x04
字节(^D
)来表示输入结束。您使用 Ctrl + D (即/.*/
)键入它以结束对shell或从stdin读取的任何其他程序的输入。
然而,正如其他人所指出的那样,这与EOF不同,EOF本身就是一种条件,而不是一条数据。
答案 5 :(得分:1)
在7位Wintel世界中,它是0x1A或chr(26)。
它仍然在较旧的文本文件和档案中仍然很常见,并且仍然由某些文件传输协议产生。特别是从BBS系统下载的文本文件通常以该字符终止。
对于较旧的系统,还有其他类似的标记值,例如EOL(CR,LF,CR + LF)可能需要时常预计。
看到它仍在使用可能是令人烦恼的原因,例如与return(0)处于同一级别。
答案 6 :(得分:-2)
在某些情况下,您需要文件末尾字符,例如从Unix计算机向打印机发送文件。大多数启用了Windows / DOS的打印机都希望文件结束标记能够打印存储在其存储器中的文件。如果没有发送文件结束标记,打印机就会一直坐到它超时(通常是2分钟),然后打印文件。如果使用lpr从Unix打印,则应确保包含文件结束标记。 Windows / dos自动附加它,打印机设计为等待它。