AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 537858
Accepted
gerrit
gerrit
Asked: 2019-08-29 03:03:40 +0800 CST2019-08-29 03:03:40 +0800 CST 2019-08-29 03:03:40 +0800 CST

Os arquivos realmente contêm um caractere de fim de arquivo (EOF)? [duplicado]

  • 772
Essa pergunta já tem respostas aqui :
Qual é o último caractere em um arquivo? (3 respostas)
Diferença entre EOT e EOF (3 respostas)
Fechado há 3 anos .

O Guia do Usuário do Satélite Ambiental Operacional Geoestacionário (GOES)-R (PUG) da Administração Nacional Oceânica e Atmosférica (NOAA) contém a seguinte descrição bastante prolixa de um arquivo de texto simples (§4.3) (ênfase minha):

O formato de arquivo de texto Unix é usado em um pequeno subconjunto dos arquivos de dados de origem semi-estáticos de Nível 1b e 2+. O formato de arquivo de texto Unix, menos o caractere de fim de arquivo, é incorporado em pacotes de metadados GRB para armazenar a representação NcML (linguagem de marcação netCDF) baseada em XML das especificações do arquivo netCDF, que inclui os valores para metadados do produto.

O formato de arquivo de texto Unix é uma sequência de linhas (ou seja, registros), potencialmente variável em comprimento, de texto eletrônico. Para o sistema terrestre GOES-R, o texto eletrônico, a nova linha e os caracteres de fim de arquivo estão em conformidade com o Código Padrão Americano para Intercâmbio de Informações (ASCII). No final de cada linha está o caractere de nova linha. No final do arquivo, há um caractere de final de arquivo .

Esta é uma descrição precisa do conteúdo de um arquivo? Eu pensei que o fim do arquivo era uma condição que o sistema operacional ou uma rotina de biblioteca estava retornando quando não mais dados podem ser lidos de um arquivo (ou outro fluxo). Este byte está realmente contido no arquivo?

files ascii
  • 3 3 respostas
  • 11060 Views

3 respostas

  • Voted
  1. Best Answer
    ilkkachu
    2019-08-30T06:55:06+08:002019-08-30T06:55:06+08:00

    O formato de arquivo de texto Unix é uma sequência de linhas (ou seja, registros), potencialmente variável em comprimento, de texto eletrônico. No final de cada linha está o caractere de nova linha. No final do arquivo, há um caractere de final de arquivo.

    Esta é uma descrição precisa do conteúdo de um arquivo?

    Até, mas excluindo a última parte em negrito, sim. Mas não conheço nenhum sistema Unixy que use um caractere de fim de arquivo, todos eles armazenam o comprimento de um arquivo em um byte, tornando esses marcadores desnecessários.

    Então, novamente, parece que houve sistemas que usaram um caractere de fim de arquivo. Pelo menos a Wikipedia afirma que:

    O sistema de arquivos CP/M registrava apenas os comprimentos dos arquivos em múltiplos de "registros" de 128 bytes, portanto, por convenção, um caractere Control-Z era usado para marcar o fim de dados significativos se eles terminassem no meio de um registro.

    Ter comprimentos de arquivo armazenados apenas até um bloco exigiria algum tipo de customização para codificar o final da última linha dentro do fluxo de dados. Qualquer programa que manuseie dados binários também teria que lidar com os tamanhos de arquivo mais granulares de alguma forma. No entanto, com arquivos binários, pode ser mais fácil ignorar os bytes "extras" à direita.

    Acho que vi Control-Z usado como marcador EOF no MS-DOS, mas também não era necessário.

    Esse texto citado parece ter uma ideia equivocada de arquivos de texto nos sistemas atuais. Se observarmos o que o padrão POSIX diz , não há menção a um caractere ou marcador de final de arquivo para arquivos de texto, apenas que eles não contêm bytes NUL e consistem em linhas (terminando em novas linhas).

    Veja também: Qual é o último caractere em um arquivo?

    Quanto a esta parte...

    Para o sistema de solo GOES-R, [...] e os caracteres de fim de arquivo estão em conformidade com o Código Padrão Americano para Intercâmbio de Informações (ASCII).

    Como outros disseram nos comentários, não há caractere para fim de arquivo em ASCII, pelo menos não com esse nome (*) . Control-Z mencionado acima é 26, ou "substituto" (SUB), "usado para indicar caracteres ilegíveis ou inválidos". Então, com base apenas nesse texto, seria difícil saber qual seria o caractere EOF, se fosse usado.

    (* Há "fim de texto" (ETX, código 3), "fim de transmissão" (EOT, código 4), "fim de bloco de transmissão" (ETB, 23), "fim de meio" (EOM, 25) e também "separador de arquivos" (FS, 28). Fechado, mas não exato.)

    Eu pensei que o fim do arquivo era uma condição que o sistema operacional ou uma rotina de biblioteca estava retornando quando não mais dados podem ser lidos de um arquivo (ou outro fluxo).

    Isso é o que é, de fato. A chamada do sistema read()retorna zero bytes (sem erro) quando o final de um arquivo é atingido, enquanto algumas funções stdio ( getchar()) têm um valor especial de retorno para ele, sem surpresa chamado EOF.

    Veja também: Diferença entre EOT e EOF

    • 4
  2. Philip Couling
    2019-08-29T14:29:32+08:002019-08-29T14:29:32+08:00

    Isso parece ser algo muito específico para o formato de arquivo que eles estão discutindo. Como regra geral, os arquivos não PRECISAM de um caractere EOF. Non é adicionado sem um programa explicitamente escrevendo um.

    Verificando uma tabela ASCII, não vejo um caractere EOF. Eles podem estar se referindo a um personagem EOT ou FS, mas isso não está claro. https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

    No entanto, é comum em alguns formatos de arquivo colocar um marcador no final do arquivo. Particularmente em formatos de arquivo simples que se destinam à comunicação. Isso protege contra arquivos truncados inadvertidamente. Se você sabe que um arquivo deve terminar com um marcador específico, e esse marcador só vem no final, o. Você pode facilmente dizer se recebeu o arquivo inteiro ou apenas parte dele. Conforme eu leio, eles estão se referindo a esse tipo de marcador.

    • 3
  3. Austin Hemmelgarn
    2019-08-29T11:27:56+08:002019-08-29T11:27:56+08:00

    O caractere 'fim do arquivo' ao qual eles estão se referindo é provavelmente uma única nova linha ocorrendo como o último caractere no arquivo. A maioria dos arquivos de texto convencionais em sistemas UNIX e semelhantes a UNIX terminam de tal maneira que você pode usar o catcomando (ou algo similar` para exibir o conteúdo do arquivo e ter certeza de que o próximo prompt de comando estará em sua própria linha.

    Alguns aplicativos mal comportados, na verdade, não conseguem analisar os arquivos corretamente se não virem essa nova linha final. A esse respeito, é um pouco como a marca de ordem de byte Unicode no texto codificado em UTF-8, não é necessária (na verdade, nem deveria estar lá de acordo com a maioria dos padrões), mas alguns aplicativos se recusam a interpretar as coisas como UTF-8 sem ele.


    Da perspectiva do próprio sistema operacional, porém, não existe tal 'personagem'. O sistema de arquivos armazena o tamanho correto para o arquivo e, quando solicitado a ler o arquivo, o sistema operacional retorna exatamente essa quantidade de dados no total, portanto, não faz sentido ter esse conceito, muito menos ter um caractere para ele.

    Algumas pessoas confundem o código de controle EOT (^D) com este conceito, pois é amplamente usado em sistemas do tipo UNIX para sinalizar o fim de um fluxo de entrada interativa, mas isso é apenas uma convenção derivada do uso original (para sinalizar o fim de uma transmissão através de algum link de comunicação). Observe que isso é significativamente diferente dos sistemas DOS, onde ^Z foi usado para sinalizar o final de um arquivo tanto na entrada interativa quanto nos arquivos reais. O código de controle EOT na verdade não aparece no fluxo de dados que o aplicativo vê, é interpretado pelo terminal que sinaliza uma condição de fim de arquivo para o aplicativo quando encontra ^D.

    • -1

relate perguntas

  • Remova arquivos com os menores sufixos de nome de arquivo

  • Listar arquivos classificados de acordo com a linha de conteúdo específica

  • Como saber antecipadamente se um .zip tem um diretório pai dentro

  • Como encontrar tipos de arquivos específicos e tar-los?

  • du/df e ls relatando diferentes usos de disco

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve