Seite 1 von 1

Zeilenumbruch in einer Textzeile

Verfasst: 27.03.2017, 09:27
von joggel
Guten Morgen und angenehmen Wochenstart wünsch ich!

Ich habe hier seltsames Verhalten:
Ich bekomme 2 Textdateien, genauer CSV-Dateien, mehrere Zeilen lang.
Ich will beide Dateien auslesen, und in eine gemeinsame Datei übertragen.
Betrachte ich mir die beiden Ausgangsdateien mit zB NotePad++, sind alle Zeilen nacheinander, und ohne Leerzeile, abgespeichert.

Nun kommt es aber manchmal/selten vor, dass mein Schreiben in eine neue Datei irgendwie schief geht.
Zwischen den einzelnen Zeilen wird immer eine Leerzeile eingefügt!! Was ich absolut nicht verstehe...

Hier mal mein schreib-Code:

Code: Alles auswählen

	std::string currentLine;
	for(std::vector<std::string>::const_iterator iter(lines.begin()); iter!=lines.end(); ++iter)
	{
		currentLine = (*iter);
		fwrite( currentLine.c_str(), 1, currentLine.size(), fileOutput);

		fwrite( "\n", 1, 1, fileOutput);
		currentLine = std::string();
	}
(Nicht wundern das ich solche alten funktionen verwende, ich muss für WindowsCE entwickeln.)

Aber der Code müßte doch zeilenweise eine Textdatei generieren, und zwar OHNE Leerzeilen...!!!

Muß man dabei noch weiteres beachten?

Re: Zeilenumbruch in einer Textzeile

Verfasst: 27.03.2017, 10:25
von Tiles
Da dürfte wohl ein Autokorrekturverhalten deines dafür verwendeten Editors anspringen. Das sieht mir ganz danach aus als ob er Codeblöcke eben so auseinanderrückt dass sie besser lesbar sind. Und Autokorrektur macht eben meistens Unfug ^^

In welchem Editor tritt denn das Verhalten auf?

Re: Zeilenumbruch in einer Textzeile

Verfasst: 27.03.2017, 12:08
von joggel
Das liegt definitiv nicht an dem Editor.
Ich lese diese Text-Datei ja in einem anderen Programm ein, und dort ist eben jede 2te Zeile leer...

Re: Zeilenumbruch in einer Textzeile

Verfasst: 27.03.2017, 12:17
von Krishty
Wie liest du die Zeilen denn ein? Sicher, dass da kein CR oder LF am Ende des Strings hängt?

Re: Zeilenumbruch in einer Textzeile

Verfasst: 27.03.2017, 12:40
von joeydee
Wollte ich auch gerade schreiben:
\n==Linefeed(LF)==ASCII 10
\r ==CarriageReturn(CR)==ASCII 13
Z.B. könnte es daran liegen, dass in der Quelldatei mal LF und mal CR+LF oder so verwendet wird. Sowas kann in verschiedenen Systemen (Dateispezifikation/Zeichensatz, Betriebssystem, Editor - was in welchem Fall wie beeinflusst wird weiß ich jetzt auch nicht auswendig) unterschiedlich angezeigt werden.
Wenn du also z.B. die Quelldatei nur nach \n in Zeilen auftrennst, kann noch ein \r stehenbleiben, was in der neuen Datei je nachdem zu zwei Zeilenumbrüchen führen kann, falls z.B. diese mit anderem Zeichensatz interpretiert wird.

Re: Zeilenumbruch in einer Textzeile

Verfasst: 27.03.2017, 12:57
von joggel
Na ein Zeilenumbruch steht da am ende, denke ich...

Ich lese Byte für Byte ein, bis das Zeichen '\n' kommt.
Hier der quellcode:

Code: Alles auswählen

	size_t result = fread(buffer,1,bytesToRead, file);
	std::string line;
	while(result==bytesToRead)
	{
		//Zeilenumbruch
		if(strcmp(buffer, "\n")==0)
		{
			if(line.size()>0)
				lines.push_back(line);

			line = std::string();
		}
		else
			line += buffer;

		// Es wird immer nur 1(!!) Zeichen gelesen
		result = fread(buffer,1,bytesToRead, file);
	}
Edit:
Also sollte ich auf '\n' und '\r' prüfen, also wenn beide Bedingungen erfüllt sind?

Und wieso hat das sonst funktioniert, und seit einer Woche solches Verhalten?

Also gut...gerade mal alles gelesen.
Dann werd ich das mal so probieren....danke.

Re: Zeilenumbruch in einer Textzeile

Verfasst: 27.03.2017, 14:00
von joggel
Was ich nicht dabei verstehe:

Wenn ich nur bis zu dem Zeichen '\n' suche, also dieses zeichen NICHT in meinen String einfüge, dann kann eben bei der Kombination CR + LF maximal das CR-Zeichen in den String gelangen.
Das steht doch aber für die Postionierung ans anfang der Zeile....oder?

Re: Zeilenumbruch in einer Textzeile

Verfasst: 27.03.2017, 14:09
von Krishty
Alte Commodores und Apples haben CR als Zeilenumbruch genutzt, darum behandeln viele Textprogramme auch einzeln auftretende CR als Zeilenumbrüche. Du musst sowohl auf LF, als auch auf CR+LF testen und sie von deinem String ausschließen. Wenn du die Zeichen einzeln liest, dann musst du CR überspringen und dir merken, dass es ein CR war – und falls direkt darauf ein LF kommt, den ebenfalls ignorieren.

Wikipedia hat eine Liste von noch mehr Zeichen, falls du mal mit Unicode zu tun bekommst ;)
https://en.wikipedia.org/wiki/Newline#Unicode

Re: Zeilenumbruch in einer Textzeile

Verfasst: 27.03.2017, 14:20
von joggel
oki