Stai leggendo il file in modalità BINARIA o in modalità TESTO ? In modalità TESTO la coppia ritorno a capo / avanzamento riga, CRLF , viene interpretata come TESTO fine riga o carattere di fine riga, ma in BINARIO si recupera solo UN byte alla volta, il che significa che entrambi i caratteri DEVONOessere ignorato e lasciato nel buffer per essere recuperato come un altro byte! Il ritorno del carrello significa, nella macchina da scrivere, che il carrello della macchina da scrivere, dove giace il braccio di stampa, ha raggiunto il bordo destro del foglio ed è riportato sul bordo sinistro. Questo è un modello molto meccanico, quello della macchina da scrivere meccanica. Quindi l'avanzamento riga significa che il rotolo di carta viene ruotato leggermente verso l'alto in modo che la carta sia in posizione per iniziare un'altra riga di digitazione. Per quanto ricordo, una delle cifre basse in ASCII significa spostarsi a destra di un carattere senza digitare, il carattere morto e, naturalmente, \ b significa backspace: sposta l'auto di un carattere indietro. In questo modo puoi aggiungere effetti speciali, come sottostante (tipo trattino basso), barrato (tipo meno), accenti diversi approssimativi, annullamento (tipo X), senza bisogno di una tastiera estesa, semplicemente regolando la posizione dell'auto lungo la linea prima di entrare in avanzamento linea. Quindi puoi usare tensioni ASCII di dimensioni di byte per controllare automaticamente una macchina da scrivere senza un computer in mezzo. Quando viene introdotta la macchina da scrivere automatica,AUTOMATICO significa che una volta raggiunto il bordo più lontano della carta, l'auto viene riportata a sinistra E l'avanzamento di riga applicato, cioè, si presume che la macchina ritorni automaticamente quando il rotolo si alza! Quindi non hai bisogno di entrambi i caratteri di controllo, solo uno, la \ n, nuova riga o avanzamento riga.
Questo non ha nulla a che fare con la programmazione, ma ASCII è più vecchio e HEY! sembra che alcune persone non stessero pensando quando hanno iniziato a fare cose di testo! La piattaforma UNIX presuppone una macchina di tipo automatica elettrica; il modello Windows è più completo e consente il controllo di macchine meccaniche, anche se alcuni caratteri di controllo diventano sempre meno utili nei computer, come il carattere campana, 0x07 se ricordo bene ... Alcuni testi dimenticati devono essere stati originariamente catturati con caratteri di controllo per macchine da scrivere a comando elettrico e ha perpetuato il modello ...
In realtà la variazione corretta sarebbe quella di includere solo \ r, avanzamento riga, il ritorno a capo non essendo necessario, cioè automatico, quindi:
char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...
sarebbe il modo più corretto per gestire tutti i tipi di file. Nota tuttavia che \ n in modalità TESTO è effettivamente la coppia di byte 0x0d 0x0a, ma 0x0d È solo \ r: \ n include \ r in modalità TESTO ma non in BINARIO , quindi \ ne \ r \ n sono equivalenti ... o dovrebbe essere. Questa è una confusione molto basilare del settore in realtà, tipica inerzia del settore, poiché la convenzione è parlare di CRLF, in TUTTE le piattaforme, quindi cadere in diverse interpretazioni binarie. A rigor di termini, i file che includono SOLO 0x0d (ritorno a capo) come \ n (CRLF o avanzamento riga), non sono corretti in TEXTmodalità (macchina da scrivere: basta restituire la macchina e barrare tutto ...), e sono un formato binario non orientato alla riga (\ r o \ r \ n significa orientato alla riga) quindi non dovresti leggere come testo! Il codice dovrebbe fallire forse con qualche messaggio utente. Questo non dipende solo dal sistema operativo, ma anche dall'implementazione della libreria C, aggiungendo confusione e possibili variazioni ... (in particolare per i livelli di traduzione UNICODE trasparenti aggiungendo un altro punto di articolazione per variazioni confuse).
Il problema con lo snippet di codice precedente (macchina da scrivere meccanica) è che è molto inefficiente se non ci sono \ n caratteri dopo \ r (testo macchina da scrivere automatica). Quindi assume anche la modalità BINARY in cui la libreria C è costretta a ignorare le interpretazioni del testo (locale) e dare via i byte puri. Non dovrebbe esserci alcuna differenza nei caratteri di testo effettivi tra le due modalità, solo nei caratteri di controllo, quindi in generale la lettura di BINARIO è migliore della modalità TESTO . Questa soluzione è efficiente per BINARYmodalità file di testo tipici del sistema operativo Windows indipendentemente dalle variazioni della libreria C e inefficiente per altri formati di testo della piattaforma (comprese le traduzioni web in testo). Se ti interessa l'efficienza, la strada da percorrere è usare un puntatore a funzione, fare un test per i controlli di riga \ r vs \ r \ n come preferisci, quindi selezionare il miglior codice utente getline nel puntatore e invocarlo da esso.
Per inciso, ricordo di aver trovato anche dei \ r \ r \ n file di testo ... che si traducono in testo a doppia riga proprio come è ancora richiesto da alcuni consumatori di testo stampato.