Pergunta

Por que DOS / Windows e Mac decidir usar \ r \ n e \ r para o fim de linha em vez de \ n? Foi apenas um resultado de tentar ser "diferente" do Unix?

E agora que o Mac OS X é Unix (-like), fez interruptor Apple para \ n de \ r?

Foi útil?

Solução

DOS herdou finais de linha CR-LF (o que você está chamando \ r \ n, apenas fazendo os caracteres ASCII explícito) de CP / M. CP / M herdou de vários sistemas operacionais DEC que influenciaram CP / M designer de Gary Kildall.

CR-LF foi usada de modo a que as máquinas de teletipo iria retornar a cabeça de impressão para a margem esquerda (CR = retorno do carro), e depois passar para a próxima linha (LF = avanço de linha).

As caras Unix manipulados que no controlador de dispositivo, e quando necessário traduzido LF para CR-LF na saída para dispositivos que dele necessitam.

E, como você adivinhou, Mac OS X agora usa LF.

Outras dicas

Realmente acrescentando @ Mark Harrison ...

As pessoas que dizem que o Unix é "apenas a saída do texto o programador especificado", enquanto DOS está quebrado estão errados simples. Há também alegações de que ele é estúpido para DOS para EOF bandeira quando vê um caractere EOF, levantando a questão do que exatamente esse caráter EOF é para.

Não há uma verdadeira convenção para fins de linha de arquivo de texto - apenas convenções específicas de plataforma. Afinal, mesmo CR-LF, CR e LF não são os únicos convenções de fim de linha para nunca ser usados, e ASCII nunca foi mesmo o primeiro e único conjunto de caracteres. O problema é a biblioteca padrão C e tempo de execução, o que fez não abstrair esse detalhe dependente de plataforma. Outros idiomas terceira geração (como Pascal e até mesmo Basic) conseguiu, pelo menos em algum grau. Devido a isso, quando compiladores C foram escritos para outras plataformas, tempo de execução hacks biblioteca foram necessários para conseguir a compatibilidade com o código fonte e os livros existentes.

Na verdade, de Unix e Multics que a tradução corda originalmente necessário para o console I / O, desde que os usuários normalmente se sentou em um terminal ASCII que exigia extremidades de linha CR LF. Esta tradução foi feita em um driver de dispositivo, embora -. O objetivo era abstrair o dispositivo de especificidades, assumindo que era melhor adotar uma convenção e cumpri-lo para arquivos de texto armazenados

O texto C I / O corte é semelhante, em princípio, ao que CygWin faz agora, cortando Linux tempos de execução para o trabalho, bem como pode ser esperado no Windows. Há uma história real de cortar coisas sobre a transformá-los em Unix-alikes - mas depois há também vinho, transformando Linux no Windows. Curiosamente, você pode ler algumas críticas-end linha equivocada do Windows na CygWin FAQ (ligação Internet Archive adicionado 2013 - a página não existe mais). Talvez seja apenas seu senso de humor, uma vez que são, basicamente, fazer o que eles estão criticando, mas em uma escala maior muito; -)

A biblioteca C ++ padrão (qualquer plataforma sua implementado em) evita esse problema usando iostreams, que abstrair extremidades line. Para saída, que me ternos finos. Para entrada, eu preciso de mais controle, então eu quer interpretar caractere por caractere ou uso então um gerador de scanner.

[ Editar Acontece que a alegação atingiu-out acima não é verdade, e nunca foi. O std::endl traduz literalmente a um \n e um flush. O \n é exatamente o mesmo \n você entrar em C - tende a se chamado de "nova linha", mas na verdade é um caractere de alimentação de linha ASCII, que então é traduzido pelo tempo de execução, se necessário. Engraçado como premissas falsas pode ficar tão enraizado que você nunca questioná-los -., Basicamente, C ++ não tinha escolha para fazer o C fez (que não adicionar mais camadas em cima) por razões de compatibilidade, e que deve sempre ter sido óbvio]

A maior fatia de culpa do meu POV é com C, mas C não é o único projeto para deixar de antecipar a sua mudança para outras plataformas. Culpar Bill Gates é apenas nozes - tudo o que ele fez foi comprar e polir uma variante do CP então popular / M. Realmente, é apenas a história - a mesma razão pela qual não sabemos o que os códigos de caracteres 128 a 255 referem-se, na maioria dos arquivos de texto. Dada a facilidade de lidar com todas as convenções três linhas finais, é estranho que alguns desenvolvedores ainda insistem em que "convenção meus plataformas é o único caminho verdadeiro, e eu vou forçá-lo em você goste ou não" atitude.

Também - vai o Unicode linha separadora codepoint U + 2028 substituir todas estas convenções em arquivos de texto futuras? ; -)

Há uma vez longo artigo sobre terminações de linha em wikipedia. A "história" respostas seção, pelo menos, parte da sua pergunta: http://en.wikipedia.org/ wiki / nova linha # História

É interessante notar a CRLF é muito bonito o padrão internet. Ou seja, praticamente todos os protocolo de internet padrão que é a linha orientada usos CRLF. SMTP, POP, IMAP, NNTP, etc .. O corpo de e-mail é composto por linhas terminadas por CRLF.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top