O POSIX define um arquivo de texto como:
Um arquivo que contém caracteres organizados em zero ou mais linhas. As linhas não contêm caracteres NUL e nenhuma pode exceder {LINE_MAX} bytes de comprimento, incluindo o caractere <nova linha>. Embora o POSIX.1-2017 não faça distinção entre arquivos de texto e arquivos binários (consulte o padrão ISO C), muitos utilitários produzem apenas uma saída previsível ou significativa ao operar em arquivos de texto. Os utilitários padrão que possuem tais restrições sempre especificam "arquivos de texto" em suas seções STDIN ou INPUT FILES.
Fonte: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403
No entanto, há várias coisas que não acho claras:
Um arquivo de texto deve ser um arquivo normal? No trecho acima, não diz explicitamente que o arquivo deve ser um arquivo regular
Um arquivo pode ser considerado um arquivo de texto se contiver um caractere e apenas um caractere (ou seja, um único caractere que não termine com uma nova linha)? Sei que essa pergunta pode parecer complicada, mas eles usam a palavra "caracteres" em vez de "um ou mais caracteres". Outros podem discordar, mas se eles querem dizer "um ou mais personagens", acho que deveriam dizer isso explicitamente
No trecho acima, faz referência a "linhas". Encontrei quatro definições com linha em seu nome: "Linha Vazia", "Linha de Exibição", "Linha Incompleta" e "Linha". Devo inferir que eles significam "Linha" por causa da omissão de "Vazio", "Exibir" e "Incompleto" - ou todas as quatro dessas definições são consideradas uma linha no trecho acima?
Todas as perguntas que vêm após este bloco de texto dependem da inferência de que "caracteres" significa "um ou mais caracteres":
- Posso inferir com segurança que, se um arquivo estiver vazio, não é um arquivo de texto porque não contém um ou mais caracteres?
Todas as perguntas que vêm após este bloco de texto dependem da inferência de que no trecho acima, uma linha é definida como "Linha", e que as outras três definições que contêm "Linha" em seu nome devem ser excluídas:
O "zero" em "zero ou mais linhas" significa que um arquivo ainda pode ser considerado um arquivo de texto se contiver um ou mais caracteres que não sejam terminados com nova linha?
"Zero ou mais linhas" significa que uma vez que uma única "Linha" (0 ou mais caracteres mais uma nova linha de terminação) entra em jogo, torna-se ilegal que a última linha seja uma "Linha incompleta" (uma ou mais linhas não caracteres de nova linha no final de um arquivo)?
"Nenhum [nenhuma linha] pode exceder {LINE_MAX} bytes de comprimento, incluindo o caractere de nova linha" significa que há uma limitação para o número de caracteres permitidos em qualquer "Linha" em um arquivo de texto (como um aparte, o valor de LINE_MAX no Ubuntu 18.04 e FreeBSD 11.1 é "2048")?
Não; o trecho até mesmo observa especificamente a entrada padrão como um arquivo de texto em potencial. Outros utilitários padrão, como o
make
, usam especificamente o arquivo especial de caracteres/dev/null
como um arquivo de texto .Esse caractere deve ser um <newline>, ou isso não é uma linha e, portanto, o arquivo em que está não é um arquivo de texto. Um arquivo contendo exatamente o byte 0A é um arquivo de texto de uma linha. Uma linha vazia é uma linha válida.
Não é realmente uma inferência, é apenas o que diz. A palavra "linha" recebeu uma definição contextualmente apropriada e é disso que ela está falando.
Um arquivo vazio consiste em zero (ou mais) linhas e, portanto, é um arquivo de texto.
Não, esses caracteres não são organizados em linhas.
Não é ilegal , apenas não é um arquivo de texto. Um utilitário que exige que um arquivo de texto seja fornecido a ele pode se comportar de maneira adversa se for fornecido esse arquivo.
Sim.
Esta definição está apenas tentando definir alguns limites sobre o que um utilitário baseado em texto ( por exemplo,
grep
) definitivamente aceitará — nada mais. Eles também são livres para aceitar as coisas de forma mais liberal, e muitas vezes o fazem na prática. Eles têm permissão para usar um buffer de tamanho fixo para processar uma linha, assumir que uma nova linha aparece antes de estar cheia e assim por diante. Você pode estar lendo muito nas coisas.Conforme definido pelo POSIX:
Sim, um arquivo de texto é (basicamente):
Seria útil incluir também estas definições:
3.92 Cadeia de Caracteres
3.195 Linha Incompleta
3.206 Linha
3.243 Caractere de nova linha (<nova linha>)
3.247 NUL
Observe que um "arquivo de texto" não deve conter bytes NUL.
Então:
Não, não precisa ser. Um "arquivo de texto" é definido em termos do que ele contém quando lido. Se um arquivo contém "zero ou mais linhas", é um arquivo de texto. Alguns arquivos, como
/dev/stdin
, podem conter um arquivo de texto se lidos de uma vez e não na próxima vez que forem lidos.Não, essa é uma linha incompleta (3.195).
Um arquivo de texto deve conter apenas "Linhas incompletas".
Sim você deveria.
Não, um arquivo vazio (zero caracteres) é um "arquivo de texto" válido.
De cima: …zero ou mais linhas… . Zero linhas (zero caracteres) é um "arquivo de texto" válido.
Não, uma "linha incompleta" não é (tecnicamente) uma "linha" válida.
O "zero" em "zero ou mais linhas" significa que um arquivo ainda pode ser considerado um arquivo de texto se contiver um ou mais caracteres que não sejam terminados com nova linha?
Não, uma linha incompleta não é uma "Linha". Um arquivo de texto não deve ter linhas incompletas.
… há uma limitação no número de caracteres permitidos em qualquer "Linha" em um arquivo de texto … ?
Sim, não mais do que {LINE_MAX} bytes (ao contrário de caracteres) serão permitidos em qualquer linha de um "arquivo de texto" válido.
O valor de {LINE_MAX} é dado no arquivo <limits.h>
(leia também Sensible line buffer size in C? ):
Para um sistema baseado em GNU, não há limite definido (exceto memória) :
Parece ser definido em
posix_lim.h
2048 (pelo menos para sistemas Linux GNU de 64 bits):Também pode ser encontrado usando o utilitário POSIX getconf :
Relacionado: Por que os arquivos de texto devem terminar com uma nova linha?