¿Está leyendo el archivo en modo BINARIO o TEXTO ? En el modo TEXT , el par retorno de carro / avance de línea, CRLF , se interpreta como un carácter de fin de línea o fin de línea de TEXTO , pero en BINARIO se obtiene solo UN byte a la vez, lo que significa que cualquiera de los dos caracteres DEBEser ignorado y dejado en el búfer para ser recuperado como otro byte. Retorno de carro significa, en la máquina de escribir, que el carro de la máquina de escribir, donde se encuentra el brazo de impresión, ha llegado al borde derecho del papel y regresa al borde izquierdo. Este es un modelo muy mecánico, el de la máquina de escribir mecánica. Luego, el avance de línea significa que el rollo de papel se gira un poco hacia arriba para que el papel esté en posición para comenzar otra línea de escritura. Tan rápido como recuerdo, uno de los dígitos bajos en ASCII significa mover hacia la derecha un carácter sin escribir, el carácter muerto y, por supuesto, \ b significa retroceso: mover el automóvil un carácter hacia atrás. De esa manera, puede agregar efectos especiales, como subyacente (escriba subrayado), tachado (escriba menos), aproximadamente acentos diferentes, cancelar (escriba X), sin necesidad de un teclado extendido, simplemente ajustando la posición del automóvil a lo largo de la línea antes de ingresar al avance de línea. Por lo tanto, puede usar voltajes ASCII de tamaño byte para controlar automáticamente una máquina de escribir sin una computadora en el medio. Cuando se introduce la máquina de escribir automática,AUTOMÁTICO significa que una vez que llega al borde más lejano del papel, el carro regresa a la izquierda Y se aplica el avance de línea, es decir, se asume que el carro regresa automáticamente cuando el rollo sube. Por lo tanto, no necesita ambos caracteres de control, solo uno, \ n, nueva línea o salto de línea.
Esto no tiene nada que ver con la programación, pero ASCII es más antiguo y ¡HEY! ¡Parece que algunas personas no estaban pensando cuando empezaron a escribir mensajes de texto! La plataforma UNIX asume una máquina de tipos automática eléctrica; el modelo de Windows es más completo y permite el control de máquinas mecánicas, aunque algunos caracteres de control se vuelven cada vez menos útiles en las computadoras, como el carácter de campana, 0x07 si mal no recuerdo ... Algunos textos olvidados deben haber sido capturados originalmente con caracteres de control para máquinas de escribir controladas eléctricamente y perpetuó el modelo ...
En realidad, la variación correcta sería simplemente incluir \ r, salto de línea, siendo innecesario el retorno de carro, es decir, automático, por lo tanto:
char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...
sería la forma más correcta de manejar todo tipo de archivos. Sin embargo , tenga en cuenta que \ n en modo TEXTO es en realidad el par de bytes 0x0d 0x0a, pero 0x0d ES simplemente \ r: \ n incluye \ r en modo TEXTO pero no en BINARIO , por lo que \ n y \ r \ n son equivalentes ... o debiera ser. Esta es una confusión de la industria muy básica en realidad, la inercia típica de la industria, ya que la convención es hablar de CRLF, en TODAS las plataformas, y luego caer en diferentes interpretaciones binarias. Estrictamente hablando, los archivos que incluyen SÓLO 0x0d (retorno de carro) como \ n (CRLF o salto de línea), tienen un formato incorrecto en TEXTOmodo (máquina de escribir: simplemente devuelva el automóvil y tache todo ...), y son un formato binario no orientado a líneas (ya sea \ r o \ r \ n, es decir, orientado a líneas), por lo que no debe leer como texto. El código debería fallar tal vez con algún mensaje de usuario. Esto no depende solo del sistema operativo, sino también de la implementación de la biblioteca C, lo que aumenta la confusión y las posibles variaciones ... (particularmente para las capas de traducción transparentes de UNICODE que agregan otro punto de articulación para variaciones confusas).
El problema con el fragmento de código anterior (máquina de escribir mecánica) es que es muy ineficaz si no hay \ n caracteres después de \ r (texto de máquina de escribir automática). Luego, también asume el modo BINARIO donde la biblioteca C se ve obligada a ignorar las interpretaciones de texto (configuración regional) y regalar los bytes. No debería haber diferencia en los caracteres de texto reales entre ambos modos, solo en los caracteres de control, por lo que, en general, leer BINARIO es mejor que el modo TEXTO . Esta solución es eficiente para BINARYmodo archivos de texto típicos del sistema operativo Windows, independientemente de las variaciones de la biblioteca C, e ineficaz para otros formatos de texto de plataforma (incluidas las traducciones web a texto). Si le preocupa la eficiencia, el camino a seguir es usar un puntero de función, hacer una prueba para los controles de línea \ r vs \ r \ n de la forma que desee, luego seleccionar el mejor código de usuario de getline en el puntero e invocarlo desde eso.
Por cierto, recuerdo que también encontré algunos archivos de texto \ r \ r \ n ... que se traducen en texto de doble línea, tal como todavía lo requieren algunos consumidores de texto impreso.