Lesen Sie die Datei im BINARY- oder im TEXT- Modus? In TEXT - Modus das Paar Wagenrücksetz / Zeilenvorschub, CRLF wird interpretiert als TEXT Ende der Zeile oder Zeilenendezeichen, aber in BINARY holen Sie ONE Byte zu einem Zeitpunkt, der bedeutet , dass entweder Zeichen MUSTignoriert und im Puffer belassen werden, um als weiteres Byte abgerufen zu werden! Wagenrücklauf bedeutet in der Schreibmaschine, dass das Schreibmaschinenauto, in dem der Druckarm liegt, die rechte Kante des Papiers erreicht hat und zur linken Kante zurückgeführt wird. Dies ist ein sehr mechanisches Modell, das der mechanischen Schreibmaschine. Dann bedeutet der Zeilenvorschub, dass die Papierrolle ein wenig nach oben gedreht wird, sodass das Papier in der Lage ist, eine weitere Zeile zu schreiben. Soweit ich mich erinnere, bedeutet eine der niedrigen Ziffern in ASCII, dass Sie ein Zeichen ohne Eingabe nach rechts bewegen, das tote Zeichen, und natürlich bedeutet \ b Rücktaste: Bewegen Sie das Auto um ein Zeichen zurück. Auf diese Weise können Sie Spezialeffekte wie Basiswert (Typ Unterstrich), Durchgestrichen (Typ Minus) hinzufügen, unterschiedliche Akzente annähern, aufheben (Typ X), ohne eine erweiterte Tastatur zu benötigen. Nur durch Einstellen der Position des Fahrzeugs entlang der Linie vor dem Eingeben des Linienvorschubs. Sie können also ASCII-Spannungen in Byte-Größe verwenden, um eine Schreibmaschine automatisch zu steuern, ohne dass sich dazwischen ein Computer befindet. Wenn die automatische Schreibmaschine eingeführt wird,AUTOMATISCH bedeutet, dass, sobald Sie die äußerste Kante des Papiers erreicht haben, das Auto nach links zurückkehrt UND der angewendete Zeilenvorschub, dh das Auto wird automatisch zurückgegeben, wenn sich die Rolle nach oben bewegt! Sie benötigen also nicht beide Steuerzeichen, sondern nur eines, die \ n, die neue Zeile oder den Zeilenvorschub.
Dies hat nichts mit Programmierung zu tun, aber ASCII ist älter und HEY! Es sieht so aus, als hätten einige Leute nicht nachgedacht, als sie anfingen, Textsachen zu machen! Die UNIX-Plattform setzt eine elektrische automatische Maschinenmaschine voraus. Das Windows-Modell ist vollständiger und ermöglicht die Steuerung mechanischer Maschinen, obwohl einige Steuerzeichen auf Computern immer weniger nützlich sind, wie das Glockenzeichen 0x07, wenn ich mich recht erinnere ... Einige vergessene Texte müssen ursprünglich mit Steuerzeichen erfasst worden sein für elektrisch gesteuerte Schreibmaschinen und es verewigte das Modell ...
Tatsächlich wäre die richtige Variante, nur den Zeilenvorschub \ r einzuschließen, wobei der Wagenrücklauf unnötig ist, dh automatisch, daher:
char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');
//ignore following \n or restore the buffer data
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...
wäre der korrekteste Weg, um alle Arten von Dateien zu behandeln. Beachte jedoch , dass \ n in TEXT - Modus ist eigentlich das Byte - Paar 0x0d 0x0A, aber 0x0d IST nur \ r \ n \ r enthält in TEXT - Modus jedoch nicht in BINARY , so \ n und \ r \ n oder äquivalent sind ... sollte sein. Dies ist eine sehr grundlegende Verwirrung in der Branche, eine typische Trägheit der Branche, da die Konvention darin besteht, auf ALLEN Plattformen von CRLF zu sprechen und dann in verschiedene binäre Interpretationen zu fallen. Genau genommen sind Dateien, die NUR 0x0d (Wagenrücklauf) als \ n (CRLF oder Zeilenvorschub) enthalten, in TEXT fehlerhaftModus (Schreibmaschinenmaschine: einfach das Auto zurückgeben und alles durchstreichen ...) und sind ein nicht zeilenorientiertes Binärformat (entweder \ r oder \ r \ n bedeutet zeilenorientiert), sodass Sie nicht als Text lesen sollen! Der Code sollte möglicherweise mit einer Benutzermeldung fehlschlagen. Dies hängt nicht nur vom Betriebssystem ab, sondern auch von der Implementierung der C-Bibliothek, was die Verwirrung und mögliche Variationen erhöht ... (insbesondere für transparente UNICODE-Übersetzungsebenen, die einen weiteren Artikulationspunkt für verwirrende Variationen hinzufügen).
Das Problem mit dem vorherigen Code-Snippet (mechanische Schreibmaschine) ist, dass es sehr ineffizient ist, wenn nach \ r keine \ n Zeichen stehen (automatischer Schreibmaschinentext). Dann wird auch der BINARY- Modus angenommen, in dem die C-Bibliothek gezwungen ist, Textinterpretationen (Gebietsschema) zu ignorieren und die bloßen Bytes weiterzugeben. Es sollte keinen Unterschied in den tatsächlichen Textzeichen zwischen beiden Modi geben, nur in den Steuerzeichen. Daher ist das Lesen von BINARY im Allgemeinen besser als der TEXT- Modus. Diese Lösung ist für BINARY effizientModus typische Windows OS-Textdateien unabhängig von Variationen der C-Bibliothek und ineffizient für andere Plattformtextformate (einschließlich Webübersetzungen in Text). Wenn Sie Wert auf Effizienz legen, müssen Sie einen Funktionszeiger verwenden, einen Test für \ r vs \ r \ n Zeilensteuerelemente durchführen, wie Sie möchten, und dann den besten getline-Benutzercode in den Zeiger auswählen und von dort aus aufrufen es.
Ich erinnere mich übrigens, dass ich auch einige \ r \ r \ n Textdateien gefunden habe ... die sich in zweizeiligen Text übersetzen lassen, so wie es einige gedruckte Textkonsumenten noch benötigen.