Você está lendo o arquivo em modo BINÁRIO ou TEXTO ? No modo TEXTO , o par retorno de carro / alimentação de linha, CRLF , é interpretado como TEXTO de fim de linha ou caractere de fim de linha, mas em BINÁRIO você busca apenas UM byte por vez, o que significa que qualquer um dos caracteres DEVEser ignorado e deixado no buffer para ser obtido como outro byte! Retorno de carro significa, na máquina de escrever, que o carro da máquina de escrever, onde está o braço de impressão, atingiu a borda direita do papel e voltou à borda esquerda. Este é um modelo muito mecânico, o da máquina de escrever mecânica. Em seguida, o avanço de linha significa que o rolo de papel é girado um pouco para cima, de forma que o papel esteja em posição de iniciar outra linha de digitação. Pelo que me lembro, um dos dígitos mais baixos em ASCII significa mover um caractere para a direita sem digitar, o caractere morto e, claro, \ b significa retroceder: mover o carro um caractere para trás. Dessa forma, você pode adicionar efeitos especiais, como subjacente (digite sublinhado), tachado (digite menos), acentos diferentes aproximados, cancelar (digite X), sem a necessidade de um teclado estendido, apenas ajustando a posição do carro ao longo da linha antes de entrar na alimentação de linha. Portanto, você pode usar voltagens ASCII de byte para controlar automaticamente uma máquina de escrever sem um computador no meio. Quando a máquina de escrever automática é introduzida,AUTOMÁTICO significa que uma vez que você atinge a borda mais distante do papel, o carro é retornado para a esquerda E o avanço de linha é aplicado, ou seja, o carro é assumido como retornado automaticamente conforme o rolo sobe! Portanto, você não precisa de ambos os caracteres de controle, apenas um, o \ n, nova linha ou alimentação de linha.
Isso não tem nada a ver com programação, mas ASCII é mais antigo e HEY! parece que algumas pessoas não estavam pensando quando começaram a fazer coisas de texto! A plataforma UNIX assume uma máquina de tipo elétrica automática; o modelo do Windows é mais completo e permite o controle de máquinas mecânicas, embora alguns caracteres de controle se tornem cada vez menos úteis em computadores, como o caractere de sino, 0x07 se bem me lembro ... Alguns textos esquecidos devem ter sido originalmente capturados com caracteres de controle para máquinas de escrever eletricamente controladas e perpetuou o modelo ...
Na verdade, a variação correta seria incluir apenas o \ r, alimentação de linha, o retorno do carro sendo desnecessário, ou seja, automático, portanto:
char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...
seria a maneira mais correta de lidar com todos os tipos de arquivos. Observe, entretanto, que \ n no modo TEXT é na verdade o par de bytes 0x0d 0x0a, mas 0x0d IS apenas \ r: \ n inclui \ r no modo TEXT , mas não no BINARY , então \ ne \ r \ n são equivalentes ... ou deveria estar. Esta é uma confusão muito básica da indústria, na verdade, inércia típica da indústria, já que a convenção é falar de CRLF, em TODAS as plataformas, então cair em diferentes interpretações binárias. A rigor, os arquivos que incluem SOMENTE 0x0d (retorno de carro) como sendo \ n (CRLF ou alimentação de linha) estão malformados em TEXTmodo (máquina de escrever: basta retornar o carro e tachar tudo ...), e são um formato binário não orientado por linha (\ r ou \ r \ n significando orientado por linha) então você não deve ler como texto! O código deve falhar, talvez com alguma mensagem do usuário. Isso não depende apenas do sistema operacional, mas também da implementação da biblioteca C, aumentando a confusão e as possíveis variações ... (particularmente para camadas de tradução UNICODE transparentes adicionando outro ponto de articulação para variações confusas).
O problema com o trecho de código anterior (máquina de escrever mecânica) é que ele é muito ineficiente se não houver \ n caracteres após \ r (texto de máquina de escrever automática). Em seguida, também assume o modo BINÁRIO , onde a biblioteca C é forçada a ignorar as interpretações de texto (local) e fornecer os bytes absolutos. Não deve haver diferença nos caracteres de texto reais entre os dois modos, apenas nos caracteres de controle, portanto, de modo geral, ler BINÁRIO é melhor do que o modo TEXTO . Esta solução é eficiente para BINARYmodo arquivos de texto típicos do sistema operacional Windows, independentemente das variações da biblioteca C, e ineficiente para outros formatos de texto de plataforma (incluindo traduções da web em texto). Se você se preocupa com a eficiência, o caminho a percorrer é usar um ponteiro de função, fazer um teste para \ r vs \ r \ n controles de linha da maneira que quiser, então selecione o melhor código de usuário getline no ponteiro e invoque-o de isto.
A propósito, lembro que encontrei alguns \ r \ r \ n arquivos de texto também ... o que se traduz em texto de linha dupla, assim como ainda é exigido por alguns consumidores de texto impresso.