Seite 1 von 1

Daten Byteweise aus .txt auslesen und Wordweise in .txt schr

Verfasst: 9. September 2010 14:57
von mrob
Hallo,

mal wieder ein newbie on board.

Ich brauche bei folgender Aufgabe Hilfe.
Ich möchte eine txt-Datei Byteweise einlesen, einen Offset aufaddieren und das Ergebnis Wordweise in eine txt-Datei zurück schreiben.

Zur Info: Ich habe eine txt.Datei mit ASCII-Zeichen. Die wird in ein EPROM gebrannt um Texte an ein LCD aus zu geben.
Jetzt soll ein anderes LCD mit einem anderen Zeichensatz verwendet werden. Der neue Zeichensatz stellt jedes Zeichen mit einem WORD da.

Nun brauche ich also ein Programm, dass die bestehenden Texte vom alten in den neuen Zeichensatz umwandelt.

Also wird z.B. 0x41 für ein "A" ausgelesen. Darauf muss dann 0xA380 aufaddiert werden und das Ergebnis (0xA3C1) in eine neue Datei geschrieben werden.
Als zusatz muss in der Schleife noch darauf geachtet werden, ob das eingelesene Byte 0x0A (ein Zeilenumbruch) ist, das soll als 0x000A weg geschrieben werden.

Hier der Code, den ich schon mal habe.
Was meint Ihr zu der Grundfunktion?
Wie schreibe ich die Daten dann als WORD weg?

Code: Alles auswählen

#include <qfile.h>
#include <qstring.h>
#include <iostream>
#include <qmessagebox.h>

void Hauptfenster::init()
{
    QFile lesefile( "input.txt" );
    QFile schreibfile( "output.txt" );
    int lesechar;
    int schreibchar;
    int offset=41921;
    bool loop;
    loop = true;
    if (lesefile.open ( IO_ReadOnly ))
    {
	if (schreibfile.open ( IO_WriteOnly ))
	{
	    while ( loop )
	    {
		lesechar = lesefile.getch();
		if (lesechar==-1)
		{
		    // Fileende Schleife beenden
		    loop = false;
		}
		else
		{
		    if ( lesechar == 10 )
		    { // wenn 0A
			schreibfile.putch(10); // 0A schreiben
		    }
		    else
		    {
			schreibchar=lesechar + offset;
			schreibfile.putch(schreibchar);
		    }
		}
	    }  // while (loop)
	    
	} // if (schreibfile.open ( IO_WriteOnly )
	else
	{
	    //QMessageBox::critical (0,"",QString::QString("Datei kann nicht geoeffnet werden: output.txt !!!"));
	} // else if (schreibfile.open ( IO_WriteOnly )
	schreibfile.close();
    }
    } // if (lesefile.open ( IO_ReadOnly ))
    else
    {
	//QMessageBox::critical (0,"",QString::QString("Datei kann nicht geoeffnet werden: input.txt !!!"));
	return;
    }
    lesefile.close();
    textLabel1.setText( "Dateioperation beendet..." );
return;
}
Danke für Eure Hilfe.

Verfasst: 9. September 2010 17:06
von solarix
Wenn ich dich recht verstehe, wird das Ergebnis doppelt so gross wie die Ursprungsdatei.. oder?
BTW.. WORD ist eine schlechte Angabe (http://en.wikipedia.org/wiki/Word_%28co ... word_sizes).

Weil es sich um LCD-Daten handelt, sind das vermutlich nicht gerade GBytes.. daher würde ich:

1. Inhalt einlesen
2. Inhalt konvertieren
3. neuer Inhalt schreiben.

Also so in etwa:

Code: Alles auswählen

   QByteArray inputBuffer = lesefile.readAll();
   QByteArray outputBuffer(inputBuffer.size()*2,0);
   for (int i=0; i<inputBuffer.size();i++) {
     // \n-Behandlung....
     int newValue = inputBuffer.at(i);
     if (newValue != '\n')
       newValue += offset;
     outputBuffer[i*2]     = newValue >> 8;    // oberes Byte
     outputBuffer[i*2+1] = newValue & 0xFF;  // unteres Byte
   }
   schreibfile.write(outputBuffer);

hth..

Verfasst: 9. September 2010 18:28
von RHBaum
geht auch ohne qt ganz gut ...

streams benutzen ...
z.b. std::basic_ifstream<char> und std::basic_ofstream<wchar_t>

um ein zeichen von char nach wchar_t zu verwandeln, und das fuer alle zeichen nach einem bestimmten zeichensatz, dafuer gibt es eigentlich Hilfsfunktionen vom BS

Ich vermute bei dir ist es eine Convertierung von ASCII nach UTF16, richtig ?
Unter windows (w32-API) erledigt das normalerweisse MultiByteToWideChar für komplette strings.

Unix / Posix hat sicher auch was für.

und die qt selber sollt auch sowas koennen.
nen QTextstream kannst mit codec angeben, ob er ascii oder unicode lesen/schreiben soll aus einem QFile

d.h. unter QT sollte Dir QTextStream die komplette arbeit abnehmen koennen !

Ciao ...

Verfasst: 13. September 2010 15:44
von mrob
Hallo und danke für Eure schnelle Antwort.

Dann werde ich mich da jetzt noch mal ran setzen und versuchen, Eure Tipps in Funktion um zu setzen. :oops:

Zu Euren Fragen noch:
Ja, es sind keine GB eher KB / wenige MB, die zu konvertieren sind.
Das Ergebnis soll dann wirklich exakt doppelt so groß werden.
Jedes Zeichen wechselt von einem Byte (8 Bit) auf ein Word (16 Bit).
Bei dem Zielformat handelt es sich um einen chinesischen Zeichensatz (GB-Code)