Seite 1 von 1

Frage zu QIODevice::getChar()

Verfasst: 27. Dezember 2009 16:02
von TK
Hallo zusammen,

A)
ich möchte eine Binärdatei zeichenweise auslesen.
Ein Zeichen sieht z.B. so aus: ÿ = 0xFF = 255
Jetzt hat aber getChar als Übergabeparameter nur char, sprich einen Wertebereich von -127 ... 127.
Mit dem folgenden workaround funktioniert das:

Code: Alles auswählen

    unsigned char x;
    char buf[1];
    
    x = 0;
    buf[0] = 0;

    InputFile->getChar(buf);
    x = (unsigned char)buf[0];
Geht das besser oder einfacher? Gibt es eine andere Funktion aus QIODevice die besser geeignet ist?

B)
Wenn ich nun x über QTextStream out(OutputFile) in eine andere Datei schreibe, steht da nun 255. Ich brauche aber wieder das Zeichen ÿ.
Muss ich nun über QDataStream binär schreiben?

C)
Ah, und noch eine Fage. Habe es eben mit QDataStream ausprobiert und das Zeichen steht nun in der Datei. Doch wie geht es, dass ich z.B. an Zeile xzy schreiben kann, da in den ersten Paar Zeilen schon etwas steht

Danke für Tipps und Hinweise 8)

Verfasst: 27. Dezember 2009 16:53
von Christian81
a) es geht nicht besser
b) mit QTextStream gar nicht - sonst würde es wohl nicht QTextstream heissen. Du suchst ganz einfach QIODevice::write()
c) Siehe QIODevice::seek()

Verfasst: 27. Dezember 2009 17:49
von TK
b)
mit:

Code: Alles auswählen

    char buf[1];
    buf[0] = 0;

    InputFile->getChar(buf);
    x = (unsigned char)buf[0];
    
    OutputFile->write(&buf[0]);
bekomme ich nicht das Zeichen ÿ, sondern ÿa0j´"

Was ist das schiefgegangen? Was soll das Zeugs hinter ÿ ? Wie bekomme ich das weg?


c)
Ja, habe ich jetzt auch gefunden. Jetzt ist es aber so, dass ich zuerst einen Header in die Datei schreibe, der aus beliebigen Zeilen bestehen kann. Mit Seek kann ich nur eine absolute Position angeben. Kann ich die Position auch relativ angeben? Oder gibt es eine Funktion, die die Position der letzten Zeile zurück gibt?

Verfasst: 27. Dezember 2009 19:21
von Christian81
b) Falsch ist nur dass Du die Doku nicht gelesen hast -> http://doc.trolltech.com/4.5/qiodevice.html#write-2
c) Doku lesen bildet auch hier -> http://doc.trolltech.com/4.5/qiodevice.html#pos

Verfasst: 27. Dezember 2009 20:18
von TK
c)
Mit seek kann ich die Position ja nur horizontal verschieben.

Code: Alles auswählen

    qint64 value;
    OutputFile->seek(100);
    value = OutputFile->pos();
value = 100, logisch. Das bringt mich aber auch nicht weiter...

Kann man auch die Position vertikal verschieben, also in die x-te Zeile eben?

Verfasst: 27. Dezember 2009 20:20
von Christian81
Wenn Du zeilenorientiert arbeiten willst musst Du alles einlesen und dann nach \n splitten. Anders, also direkt mit QIODevice geht sowas nicht. Dafür ist QIODevice zu Low-Level ausgelegt.

Verfasst: 27. Dezember 2009 20:35
von TK
Ok, ich probiere mal was aus...