Quais condições devem ser atendidas para que um arquivo seja um arquivo de texto, conforme definido pelo POSIX?

19

POSIX define um arquivo de texto como:

A file that contains characters organized into zero or more lines. The lines do not contain NUL characters and none can exceed {LINE_MAX} bytes in length, including the <newline> character. Although POSIX.1-2017 does not distinguish between text files and binary files (see the ISO C standard), many utilities only produce predictable or meaningful output when operating on text files. The standard utilities that have such restrictions always specify "text files" in their STDIN or INPUT FILES sections.

Fonte: link

No entanto, existem várias coisas que não são claras:

  1. Um arquivo de texto deve ser um arquivo normal? No trecho acima, ele não diz explicitamente que o arquivo deve ser um arquivo regular

  2. 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 seja terminado com uma nova linha)? Eu sei que esta pergunta pode parecer insignificante, mas eles usam a palavra "caracteres" em vez de "um ou mais caracteres". Outros podem discordar, mas se eles significam "um ou mais personagens" eu acho que eles deveriam explicitamente dizer isso

  3. No trecho acima, faz referência a "linhas". Eu encontrei quatro definições com linha em seu nome: "Empty Line", "Display Line", "Incomplete Line" e "Line". Devo inferir que eles significam "Linha" por causa de sua omissão de "Vazio", "Exibir" e "Incompleto" - ou todas essas quatro definições são inclusas como sendo consideradas uma linha no trecho acima?

Todas as perguntas que surgem depois desse bloco de texto dependem da inferência de que "caracteres" significam "um ou mais caracteres":

  1. Posso inferir com segurança que, se um arquivo estiver vazio, ele não é um arquivo de texto porque não contém um ou mais caracteres?

Todas as perguntas que vêm depois deste bloco de texto dependem de inferir que no trecho acima, uma linha é definida como uma "Linha" e que as outras três definições contendo "Linha" em seu nome devem ser excluídas:

  1. 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 finalizados com a nova linha?

  2. Será que "zero ou mais linhas" significa que uma vez que uma única "Linha" (0 ou mais caracteres mais uma nova linha final) entra em jogo, é ilegal que a última linha seja uma "Linha Incompleta" (um ou mais caracteres não relacionados a nova linha no final de um arquivo)?

  3. Será que "nenhuma [nenhuma linha] pode exceder {LINE_MAX} bytes, incluindo o caractere de nova linha" significa que há uma limitação no número de caracteres permitido em uma determinada "Linha" em um arquivo de texto (como um aparte, o valor de LINE_MAX no Ubuntu 18.04 e FreeBSD 11.1 é "2048")?

por Harold Fischer 27.05.2018 / 02:55

2 respostas

20
  1. Must a text file be a regular file? In the above excerpt it does not explicitly say the file must be a regular file

    Não; o trecho até menciona a entrada padrão como um arquivo de texto em potencial. Outros utilitários padrão, como make , usam especificamente o arquivo especial de tema /dev/null como um arquivo de texto .

  2. Can a file be considered a text file if contains one character and one character only (i.e., a single character that isn't terminated with a newline)?

    Esse personagem deve ser uma < newline & gt ;, ou isto não é uma linha , e assim o arquivo em que ele está não é um arquivo de texto. Um arquivo contendo exatamente o byte 0A é um arquivo de texto de linha única. Uma linha vazia é uma linha válida.

  3. In the above excerpt, it makes reference to "lines". I found four definitions with line in their name: "Empty Line", "Display Line", "Incomplete Line" and "Line". Am I supposed to infer that they mean "Line" because of their omission of "Empty", "Display" and "Incomplete"

    Não é realmente uma inferência, é apenas o que diz. A palavra "linha" recebeu uma definição contextualmente apropriada e é isso que é falando.

  4. Can I safely infer that if a file is empty, it is not a text file because it does not contain one or more characters?

    Um arquivo vazio consiste em zero (ou mais) linhas e é, portanto, um arquivo de texto.

  5. Does the "zero" in "zero or more lines" mean that a file can still be considered a text file if it contains one or more characters that are not terminated with newline?

    Não, esses caracteres não estão organizados em linhas.

  6. Does "zero or more lines" mean that once a single "Line" (0 or more characters plus a terminating newline) comes into play, that it becomes illegal for the last line to be an "Incomplete Line" (one or more non-newline characters at the end of a file)?

    Não é ilegal , não é apenas um arquivo de texto. Um utilitário que requer que um arquivo de texto seja fornecido a ele pode se comportar de maneira adversa se receber esse arquivo.

  7. Does "none [no line] can exceed {LINE_MAX} bytes in length, including the newline character" mean that there a limitation to the number of characters allowed in any given "Line" in a text file

    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 mais liberalmente, e muitas vezes eles fazem na prática. Eles têm permissão para usar um buffer de tamanho fixo para processar uma linha, para assumir que uma nova linha aparece antes de estar cheia e assim por diante. Você pode estar lendo demais nas coisas.

    
por 27.05.2018 / 03:22
7

Conforme definido pelo POSIX:

Sim, um arquivo de texto é (basicamente):

A file that contains characters organized into zero or more lines.

Seria útil incluir também estas definições:

3.92 Cadeia de caracteres

A contiguous sequence of characters terminated by and including the first null byte.

3.195 Linha Incompleta

A sequence of one or more non- <newline> characters at the end of the file.

Linha 3.206

A sequence of zero or more non- <newline> characters plus a terminating <newline> character.

3.243 Caractere de nova linha (< newline >)

A character that in the output stream indicates that printing should start at the beginning of the next line. It is the character designated by '\n' in the C language. It is unspecified whether this character is the exact sequence transmitted to an output device by the system to accomplish the movement to the next line.

3.247 NUL

A character with all bits set to zero.

Observe que um "Arquivo de texto" não deve conter bytes NUL.

Então:

  1. Um arquivo de texto deve ser um arquivo normal?
    Não, não precisa ser. Um "arquivo de texto" é definido em termos do que ele contém quando lido. Se um arquivo contiver "zero ou mais linhas", é um arquivo de texto. Alguns arquivos, como /dev/stdin , podem conter um arquivo de texto se lidos de uma só vez e não na próxima vez em que forem lidos.
  2. Um arquivo pode ser considerado um arquivo de texto se contiver apenas um caractere e um caractere…?
    Não, essa é uma linha incompleta (3.195).
    Um arquivo de texto deve ter apenas "Linhas Incompletas".
  3. Eu deveria inferir que eles significam "Linha" ...?
    Sim você deveria.
  4. Posso inferir com segurança que, se um arquivo estiver vazio, ele não será um arquivo de texto…?
    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.
  5. … considerou um arquivo de texto se contiver um ou mais caracteres que não foram finalizados com a nova linha?
    Não, uma "Linha Incompleta" não é (tecnicamente) uma "linha" válida.
  6. 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 não terminados com nova linha?
    Não, uma linha incompleta não é uma "linha". Um arquivo de texto deve não ter linhas incompletas.

  7. ... existe uma limitação para o número de caracteres permitidos em qualquer "Linha" em um arquivo de texto ...?
    Sim, não mais do que {LINE_MAX} bytes (em oposição a caracteres) deve ser permitido em qualquer linha de um "arquivo de texto" válido.
    O valor de {LINE_MAX} é dado em o arquivo < limits.h > < br> (leia também tamanho do buffer de linha sensível em C? ):

    {LINE_MAX}
    Unless otherwise noted, the maximum length, in bytes, of a utility's input line (either standard input or another file), when the utility is described as processing text files. The length includes room for the trailing .
    Minimum Acceptable Value: {_POSIX2_LINE_MAX}

    Para um sistema baseado em GNU existe nenhum limite definido (exceto memória) :

    Macro: int LINE_MAX
    The largest text line that the text-oriented POSIX.2 utilities can support. (If you are using the GNU versions of these utilities, then there is no actual limit except that imposed by the available virtual memory, but there is no way that the library can tell you this.)

    Parece ser definido em posix_lim.h como 2048 (pelo menos para sistemas GNU Linux de 64 bits):

    $ grep -ri 'POSIX2_LINE_MAX' /usr/include/ 
    
    /usr/include/x86_64-linux-gnu/bits/xopen_lim.h:#define NL_LANGMAX       _POSIX2_LINE_MAX
    /usr/include/x86_64-linux-gnu/bits/posix2_lim.h:#define _POSIX2_LINE_MAX                2048
    /usr/include/x86_64-linux-gnu/bits/posix2_lim.h:#define LINE_MAX                _POSIX2_LINE_MAX
    

    Também pode ser encontrado usando o POSIX utilitário getconf :

    $ getconf LINE_MAX
    2048
    

Relacionado: Por que os arquivos de texto devem terminar com uma nova linha?

    
por 27.05.2018 / 03:23