[C/C++] handling von CR und LF

mueslirocker

Mitglied
Hallo,

ich benutze cygwin und damit den GNU Compiler gcc bzw g++.

Ich habe Probleme mit Zeilenumbrüchen.
Einerseits lasse ich mir von einem Fremdprogramm einen String (*char) ausgeben, der (wurde mir hoch und heilig versprochen) CR LF als Zeilenumbruch verwendet.
Wenn ich diesen String Zeichen für Zeichen durchgehe und mit alle '\r' und '\n' ausgeben lasse (um sicher zu gehen, lasse ich mir die Strings "<CR>" und "<LF>" ausgeben) finde ich nur carriage-return's.
Kann es sein, dass C(++) CRLF irgendwie als einzelnes Zeichen interpretiert? Ich hätte aber gedacht, dass es - wenn es denn so ist - dann ein Line-Feed wird.

Zweite Seite:
Ich hole mir den gleichen String (mit fgets) aus einer Datei.
Wenn ich die Datei im Hex-Editor anschaue, ist dort CR LF als Zeilenumbruch.
Wenn ich den String dann untersuche, finde ich nur LF's.

Allerdings kommt mir das \n von C merkwürdig vor.
Wenn ich ein \n in eine Datei schreibe und die mit einem Hex-Editoröffne, finde ich dort auch ein carriage-return (also CR LF).
Wenn ich aber in einem String (mitten drin) ein \n setze und in dem String auch \r's sind, und den dann speichere, wird das \n auch nur als LF gespeichert.

Kann mir jemand sagen, wie C(++) \n \r bzw CR und LF handhabt?
Ich habe auch im Netz keine eindeutigen Aussagen darüber finden. :(
 

deepthroat

Erfahrenes Mitglied
Hi.

Also die Markierung des Zeilenendes ist abhängig vom Betriebssystem. Unter Windows wird das Zeilenende durch CR/LF (CarriageReturn/LineFeed == "\r\n") markiert, bei Macintosh Dateien durch CR und bei Dateien für Unix Betriebssysteme wird ein einfaches LF verwendet.

Allerdings wird von der C Bibliothek wenn Dateien im Textmodus verarbeitet werden (also nicht im "binary" Modus geöffnete Dateien) die Zeilenende-Markierung beim Einlesen in ein einfaches LF ('\n') umgewandelt. Bei der Ausgabe geschieht dann das Gegenteil.

Das bedeutet in deinem Programm kannst du auch nicht sagen ob da vorher 2 Zeichen waren oder nicht, weil diese eben transparent ersetzt wurden. Öffne die Dateien (bzw. Streams) einfach im Binär-Modus und du "siehtst" auch die CR/LF Zeichen.

Gruß
 

mueslirocker

Mitglied
Danke für die Antwort.
Das löst schonmal die Hälfte meines Problems. :)
Werde ein wenig nachlesen müssen, aber ich denke, das werde ich schon hinbekommen.

Das fremde Programm ist in Smalltalk geschrieben.
Es weiß nicht zufällig jemand, wie Smalltalk sich beim CR und LF verhält?
Bzw, ob bei der Übergabe von einem String mit CR nud LF an ein C-Programm (über eine DLL Schnittstelle) eine ähnliche Manipulation geschieht?
 

jokey2

Erfahrenes Mitglied
Bei einer normalen Parameterübergabe sollte am Parameter eigentlich nichts vom System verändert werden.
 

mueslirocker

Mitglied
Ja, das denk ich mir auch.
Es deutet also alles darauf hin, dass das Fremdprogramm doch schon das LF wegputzt, richtig?

Okay, mit dem hab ich nichts direkt zu tun.
Bis auf weiteres sehe ich das Problem dann als gelöst an.

Danke für eure Hilfe.. ein weiteres mal. :)