当我对具有以下内容的文件发出 wc 命令时,它给出的字符数为 30。它是否包括文件结尾字符?由于包括空格和换行符,因此只有 29 个字符。
Hello World
Again Hello World
Run Code Online (Sandbox Code Playgroud)
输出是
2 5 30 test
Run Code Online (Sandbox Code Playgroud)
在 Unix 或 Linux 文件系统中没有文件结束符。该read()
系统调用的档案结尾条件返回0,如果正在使用的文件描述符是指一个普通文件。 read()
在套接字和管道上的工作方式不同。您没有特殊字符来标记文件结尾。
wc
给你 30 作为字符或字节数,因为第一行有 12 个字符计算行尾(ASCII 换行符,0x0a 数字),第二行有 18 个字符,也计算换行符(又名换行符)。
在这种情况下,您可以使用 仔细检查字符数ls -l
,如果您有hexdump
或者xxd
您可以获得一个十六进制打印输出,显示 0x0a 值的换行符。
C 标准库函数fgetc()
确实在文件结束时返回 -1,但这是在库代码中完成的,而不是由 Unix(或 Linux)或read()
系统调用完成的。
它是文件中的字节数。请参阅手册页。
这是一个 5 字节的示例:
$ echo 1234 > foo.txt
$ od -ta foo.txt
0000000 1 2 3 4 nl
0000005
$ ls -l foo.txt
-rw-r--r-- 1 tim None 5 Feb 27 21:26 foo.txt
$ wc foo.txt
1 1 5 foo.txt
Run Code Online (Sandbox Code Playgroud)
现在添加一个空行:
$ echo >> foo.txt
$ ls -l foo.txt
-rw-r--r-- 1 tim None 6 Feb 27 21:29 foo.txt
$ wc foo.txt
2 1 6 foo.txt
Run Code Online (Sandbox Code Playgroud)