readLine und das end-of-line unter MacOS X

Alles rund um die Programmierung mit Qt
Antworten
PANGAEA
Beiträge: 23
Registriert: 16. Januar 2005 18:10
Wohnort: Bremerhaven
Kontaktdaten:

readLine und das end-of-line unter MacOS X

Beitrag von PANGAEA »

Hallo,

Ich lese per QTextStream aus einer Textdatei per readLine Zeilen ein und bearbeite diese. Unter Windows ist das kein Problem. Nun ist die Macintosh-Version an der Reihe. Hier ist das EOL-Zeichen ein '\r'. Qt scheint das als EOF-Zeichen nicht zu erkennen. Stattdessen wird die ganze Datei in einem Zug in den QString geschrieben. Erschwerend kommt hinzu, dass das ursprüngliche EOL-Zeichen dabei vernichtet wird. Man kan also auch nachher nicht mehr splitten.

Code: Alles auswählen

QFile fin( FilenameIn );
if ( fin.open( QIODevice::ReadOnly | QIODevice::Text ) == TRUE )
{
  QTextStream tin( &fin );
  QString s_Line = tin.readLine();
  fin.close();
}
Hat jemand eine elegante Idee? :idea:

Danke
Rainer
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Beitrag von ChMaster »

Servus PANGAEA,

hier ein Beispiel was dir helfen könnte. Die open Funktion liefert dir einen boolean Wert zurück, daher brauchst du kein "== TRUE".

Code: Alles auswählen

QFile fin( FilenameIn ); 
if ( fin.open( QIODevice::ReadOnly | QIODevice::Text ) ) 
{ 
  QTextStream tin( &fin ); 

  while ( !tin.atEnd() ) {
    QString s_Line = tin.readLine(); 
    qDebug() << s_Line;
  }

  fin.close(); 
} 
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Ich vermute du weisst, dass OsX normales UNIX-Format hat und die "\r"-Dateien eigentlich längst der Vergangenheit angehören...

Wie dem auch sei: das ist eine uralte Geschichte...
siehe
http://trolltech.com/developer/task-tra ... &id=168345
http://trolltech.com/developer/task-tra ... thod=entry

Wie wär's mit einem readAll() und danach "split(..)" nach '\r'?
PANGAEA
Beiträge: 23
Registriert: 16. Januar 2005 18:10
Wohnort: Bremerhaven
Kontaktdaten:

Beitrag von PANGAEA »

Hallo solarix,

ja, das weiss ich. Leider erzeugen meine Kollegen nach wie vor Dateien mit einem '\r' als EOL. Das macht Excel nach wie vor automatisch, wenn man beim Abspeichern "Text, tab getrennt" nimmt. Direkt darunter kann man "Text, DOS Format" auswählen. Damit geht es dann wie gewünscht.

readAll() geht nicht. Die Dateien können leicht mal 30 MB groß werden. Außerdem (wie oben geschrieben) wird ja gerade das '\r' gelöscht. Es steht also nicht im mit readAll() erzeugten String für split() zur Verfügung :-(

Trotzdem vielen Dank für die Antwort. War hilfreich.

Rainer
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

readAll() liefert ein QByteArray, kein String...! Wenn du die Datei im Binary-Mode öffnest (also ohne das "QIODevice::Text" Flag), fehlen da garantiert keine Zeichen ;)
PANGAEA
Beiträge: 23
Registriert: 16. Januar 2005 18:10
Wohnort: Bremerhaven
Kontaktdaten:

Beitrag von PANGAEA »

So gehts:

Code: Alles auswählen

	QFile fin( FilenameIn );
	QFile fout( FilenameOut );

	fin.open( QIODevice::ReadOnly );
	fout.open( QIODevice::WriteOnly | QIODevice::Text )
	QTextStream tout( &fout );

	QByteArray ba = fin.readAll();

	int i_NumOfLines = ba.count( '\r' );

	if ( i_NumOfLines > 0 )
	{
		QStringList l = QString( ba ).split( '\r' );

		while ( i<i_NumOfLines )
			tout << l.at( i++ ) << endl;
	}

	fin.close();
	fout.close();

	fin.remove();
	fout.rename( FilenameIn );
10 MB machen keine Probleme. Herzlichen Dank für die Tipps.

Rainer
Antworten