" EOF"的十六进制代码在哪里?字符?

时间:2014-07-28 09:06:40

标签: java c++ text-files hex-editors

至于所有文件的末尾,特别是文本文件,有 EOF NULL 字符的Hex代码。当我们想要编写程序并读取文本文件的内容时,我们发送读取函数,直到我们收到该EOF十六进制代码。

我的问题:我下载了一些工具来查看文本文件的十六进制视图。但我看不到 EOF (文件结束/空)或 EOT (文字结尾)的任何十六进制代码


ASCII /十六进制代码表:

enter image description here

这是Hex查看器工具的输出:

enter image description here


注意:我的输入文件是一个文本文件,其内容为"其中十六进制代码为" EOF"?"

感谢您的时间和考虑。

7 个答案:

答案 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,但仅限于某些操作系统,甚至不一致。

ETX0x03)的使用甚至在那些昏暗和遥远的时期之前就停止了。

答案 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自动附加它,打印机设计为等待它。