Zeilenumbruch in einer Textzeile

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
joggel

Zeilenumbruch in einer Textzeile

Beitrag 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?
Tiles

Re: Zeilenumbruch in einer Textzeile

Beitrag 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?
joggel

Re: Zeilenumbruch in einer Textzeile

Beitrag 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...
Zuletzt geändert von joggel am 27.03.2017, 12:17, insgesamt 1-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Zeilenumbruch in einer Textzeile

Beitrag von Krishty »

Wie liest du die Zeilen denn ein? Sicher, dass da kein CR oder LF am Ende des Strings hängt?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
joeydee
Establishment
Beiträge: 1158
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Zeilenumbruch in einer Textzeile

Beitrag 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.
joggel

Re: Zeilenumbruch in einer Textzeile

Beitrag 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.
joggel

Re: Zeilenumbruch in einer Textzeile

Beitrag 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?
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Zeilenumbruch in einer Textzeile

Beitrag 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
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten