Dies ist eine QT-Frage zur Verwendung von QDataStream und QTemporaryFile in C++ und Linux.QDataStream und Flush
Ich habe einige Probleme bekommen einen QDataStream zu spülen. QTextStream hat eine Flush-Funktion, QDataStream benötigt jedoch anscheinend keine. (Zitat von 2013: http://www.qtcentre.org/threads/53042-QDataStream-and-flush()). Meine Frage ist, ist das tatsächlich/immer noch der Fall, und gibt es sowieso einen QDataStream zu erzwingen?
Wenn ich die Datei, die ich mit QDataStream geschrieben habe, verarbeite, fehlt die letzte Anzahl von Schreibvorgängen (112 Bytes beim Schreiben von 5 Bytes, 22 Bytes beim Schreiben von 1 Byte gleichzeitig). Wenn ich jedoch eine große Menge Padding an das Ende der Datei schreibe, dann ist der gesamte Inhalt vorhanden (mit Ausnahme der letzten paar Schreibvorgänge der Auffüllung). Deshalb glaube ich, dass der QDataStream nicht in die Datei geleert wird.
Die Dateien, die ich verarbeite, sind mittelgroße rohe Binärdateien (etwa 2 MB).
hier ein minimales Beispiel einen Teil des Codes mit I für die Verarbeitung der Dateien haben:
void read_and_process_file(QString &filename) {
QFile inputFile(filename);
if (!inputFile.open(QIODevice::ReadOnly)) {
qDebug() << "Couldn't open: " << filename;
return;
}
QDataStream fstream(&inputFile);
QTemporaryFile *tempfile = new QTemporaryFile();
if (!tempfile->open()) {
qDebug() << "Couldn't open tempfile";
return;
}
QDataStream ostream(tempfile);
while (!fstream.atEnd()) {
int block_size = 5; //The number to read at a time
char lines[block_size];
//Read from the input file
int len = fstream.readRawData(lines,block_size);
QByteArray data(lines,len);
//Will process data here once copying works
//Write to the temporary file
ostream.writeRawData(data,data.size());
}
process_file(tempfile);
delete tempfile;
}
Versuchen Sie 'tempfile-> close()' aufzurufen, bevor Sie 'process_file (tempfile)' aufrufen. – hank
Hank, das scheint das Problem zu entfernen, danke. Besteht nicht die Möglichkeit, dass die temporäre Datei aufgeräumt wird, wenn sie geschlossen ist? Ich werde einige Tests durchführen und das überprüfen. –
Nein, 'QTemporaryFile :: close' löscht die Datei nicht. Die Datei wird gelöscht, wenn das 'QTemporaryFile'-Objekt zerstört wird. Außerdem würde ich vorschlagen, Objekte nicht in einem einzigen Bereich unter Verwendung von "neu" zuzuweisen, da dies zu Speicherlecks führen kann. In Ihrem Beispiel erhalten Sie ein Leck nach "Temp Datei konnte nicht geöffnet werden". Ordnen Sie Ihr Objekt einfach dem Stack zu: 'QTemporaryFile tempfile;' – hank