据了解,所有文件(特别是文本文件)的末尾都有一个十六进制代码末梢血或者无效的字符。当我们想要编写程序并读取文本文件的内容时,我们会发送读取函数,直到收到 EOF 十六进制代码。
我的问题:我下载了一些工具来查看文本文件的十六进制视图。但我看不到任何十六进制代码末梢血(文件结束/NULL)或终止时间(正文完)
ASCII/Hex 代码表:
这是 Hex 查看器工具的输出:
注意:我的输入文件是一个文本文件,其内容是““EOF”的十六进制代码在哪里?”
答案1
传统上,在某些情况下,存在文件结束“字符” - MS-DOS / CMD.EXE 使用CTRL+ Z - Linux 使用CTRL+D
在 ASCII 表中,CTRL-Z 是代码 26,CTRL-D 是代码 4。
这些在您使用的情况下仍然有用stdin
(在“C”编程和通用控制台/tty IO 中应用的含义)。
例如
C:\> 复制 myFile.txt 这是要放入文件中的文本。Enter CTRL+Z C:\> 输入 myFile.txt 这是要放入文件中的文本。 目录:\>
在 Linux 中,同样的顺序也适用,不同之处在于你首先要
$ cat> myFile
CTRL并以+结尾D,然后cat myFile.txt
代替type
。
... 但是,如果你正在编程,你几乎看不到这些字符的任何效果。
在撰写本文时,我还没有发现任何函数调用会在这些字符处停止。
阅读软件/库的文档 - 如果没有关于这些效果的声明,那么你不太可能看到任何奇怪的事情发生。
行尾 - CR 和 LF 组合,代码 13 和 10 - 有点不同,如果你将 TEXT 文件从一个系统传输到另一个系统,它可能会变得相当混乱。
unix2dos
并且dos2unix
在 Linux'en 上有可用的 shell 命令 - 用于此目的。
示例 bash 会话:
$ echo -e "第一行\n\x04第二行。" 第一行 第二行。 $ echo -e "第一行\n\x04第二行。" | od -t x1z 0000000 46 69 72 73 74 20 6c 69 6e 65 0a 04 53 65 63 6f >第一行..第二行< 0000020 6e 64 20 6c 69 6e 65 2e 0a >第 1 行..< 0000031 $ echo -e "第一行\n\x04第二行。" | grep line 第一行 第二行。 $ cat >myFile.txt 看一下这个 $ cat myFile.txt 看一下这个 $
答案2
不,EOF 不是一个特殊字符,哈哈:)
看一看:http://www.cplusplus.com/reference/cstdio/EOF/
它基本上是一个宏:
End-of-File
It is a macro definition of type int that expands into a negative integral constant expression (generally, -1).
It is used as the value returned by several functions in header <cstdio> to indicate that the End-of-File has been reached or to signal some other failure conditions.
It is also used as the value to represent an invalid character.
In C++, this macro corresponds to the value of char_traits<char>::eof().
这意味着,API 尝试读取文件中的一行,得到 -1 并返回 EOF。与 EOF 相比,CR/LF 是特殊字符,如果您有一些换行符,您可以在 HEX 编辑器中看到它们:
'\n' or '0x0A' (10 in decimal) -> This character is called "Line Feed" (LF).
'\r' or '0x0D' (13 in decimal) -> This one is called "Carriage return" (CR).
除了文件之外,内存中字符数组的末尾还有一个 '\0' 字符,它标记字符串的结尾。没有它,计算机就无法知道该组字符有多长。当您打印/复制/无论什么字符串时,它都会继续打印/复制字符,直到找到该空字符……那时它就知道该停止了。
也许你的意思是这个NULL?