POSIX 将文本文件定义为:
包含组织成零行或多行的字符的文件。这些行不包含 NUL 字符,长度不能超过 {LINE_MAX} 个字节,包括 <newline> 字符。尽管 POSIX.1-2017 不区分文本文件和二进制文件(参见 ISO C 标准),但许多实用程序仅在对文本文件进行操作时产生可预测或有意义的输出。具有此类限制的标准实用程序始终在其 STDIN 或 INPUT FILES 部分中指定“文本文件”。
来源: http: //pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403
但是,我发现有几件事不清楚:
文本文件必须是常规文件吗?在上面的摘录中,它没有明确说明文件必须是常规文件
如果一个文件仅包含一个字符和一个字符(即,一个不以换行符终止的单个字符),是否可以将文件视为文本文件?我知道这个问题可能听起来很挑剔,但他们使用“字符”一词而不是“一个或多个字符”。其他人可能不同意,但如果他们的意思是“一个或多个字符”,我认为他们应该明确地说出来
在上面的摘录中,它提到了“行”。我找到了四个名称中带有 line 的定义:“Empty Line”、“Display Line”、“Incomplete Line”和“Line”。我是否应该推断它们的意思是“线”,因为它们省略了“空”、“显示”和“不完整”——或者所有这四个定义都包含在上面的摘录中被视为一条线?
此文本块之后出现的所有问题都取决于推断“字符”表示“一个或多个字符”:
- 我可以安全地推断,如果文件为空,则它不是文本文件,因为它不包含一个或多个字符?
此文本块之后出现的所有问题都取决于推断在上述摘录中,一行被定义为“行”,并且应排除名称中包含“行”的其他三个定义:
“零或多行”中的“零”是否意味着如果文件包含一个或多个不以换行符终止的字符,它仍然可以被视为文本文件?
“零行或多行”是否意味着一旦单个“行”(0个或多个字符加上终止换行符)起作用,最后一行成为“不完整行”(一个或多个非文件末尾的换行符)?
“none [no line] 的长度是否可以超过 {LINE_MAX} 个字节,包括换行符”是否意味着文本文件中任何给定“行”中允许的字符数有限制(顺便说一句,值Ubuntu 18.04 和 FreeBSD 11.1 上的 LINE_MAX 是“2048”)?
不; 该摘录甚至特别指出标准输入是一个潜在的文本文件。其他标准实用程序,例如
make
,专门将字符特殊文件/dev/null
用作文本文件。该字符必须是 <newline>,或者这不是line,因此它所在的文件不是文本文件。恰好包含字节 0A 的文件是单行文本文件。空行是有效行。
这不是一个真正的推论,它只是它所说的。“线”这个词已经给出了一个适合上下文的定义,所以这就是它所说的。
一个空文件由零(或更多)行组成,因此是一个文本文件。
不,这些字符没有组织成行。
这不是非法的,它只是不是一个文本文件。需要向其提供文本文件的实用程序如果改为提供该文件,则可能会产生不利的行为。
是的。
这个定义只是试图为基于文本的实用程序(例如
grep
)肯定会接受的内容设置一些界限——仅此而已。他们也可以更自由地接受事物,而且在实践中也经常这样做。他们被允许使用固定大小的缓冲区来处理一行,假设一个换行符在它满之前出现,等等。你可能读得太多了。正如 POSIX 所定义的:
是的,一个文本文件(基本上)是:
还包括以下定义会很有用:
3.92 字符串
3.195 不完整线
3.206线
3.243 换行符 (<newline>)
3.247 无
请注意,“文本文件”不应包含NUL 字节。
所以:
不,它不需要。“文本文件”是根据读取时包含的内容来定义的。如果文件包含“零行或多行”,则它是文本文件。
/dev/stdin
如果一次读取而不是在下次读取时,某些文件(如)可能包含文本文件。不,那是一条不完整的线(3.195)。
文本文件应该只有非“不完整的行”。
是的你应该。
不,空文件(零字符)是有效的“文本文件”。
从上面:…零或多行…。零行(零字符)是有效的“文本文件”。
不,不是(技术上)有效的“行”中的“不完整行”。
“零或多行”中的“零”是否意味着如果文件包含一个或多个不以换行符终止的字符,它仍然可以被视为文本文件?
不,不完整的线不是“线”。文本文件不应有不完整的行。
……文本文件中任何给定“行”中允许的字符数有限制……?
是的,在有效“文本文件”的任何给定行中不得超过 {LINE_MAX}个字节(与字符相反)。
{LINE_MAX} 的值在文件 <limits.h>
中给出 (也可以阅读Sensible line buffer size in C?):
对于基于 GNU 的系统,没有设定限制(内存除外):
它似乎被定义
posix_lim.h
为 2048(至少对于 64 位 linux GNU 系统):也可以使用 POSIX实用程序 getconf找到它:
相关: 为什么文本文件应该以换行符结尾?