Seite 1 von 1

readLine und das end-of-line unter MacOS X

Verfasst: 15. Dezember 2008 23:52
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

Verfasst: 17. Dezember 2008 12:48
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(); 
} 

Verfasst: 17. Dezember 2008 22:46
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'?

Verfasst: 18. Dezember 2008 19:06
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

Verfasst: 18. Dezember 2008 21:25
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 ;)

Verfasst: 19. Dezember 2008 19:23
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