gpt4 book ai didi

c++ - QDataStream 和 Flush

转载 作者:行者123 更新时间:2023-11-28 01:44:50 26 4
gpt4 key购买 nike

这是一个关于在 C++ 和 Linux 中使用 QDataStream 和 QTemporaryFile 的 QT 问题。

我在刷新 QDataStream 时遇到了一些问题。 QTextStream 具有刷新功能,但 QDataStream 显然不需要。 (引自 2013 年:http://www.qtcentre.org/threads/53042-QDataStream-and-flush())。我的问题是,实际上/仍然是这种情况吗?是否有强制 QDataStream 刷新的方法?

当我处理我使用 QDataStream 写入的文件时,最后的写入次数丢失了(一次写入 5 个字节时为 112 个字节,一次写入 1 个字节时为 22 个字节)。但是,如果我在文件末尾写入大量填充,则所有内容都存在(填充的最后几次写入除外)。这就是为什么我认为 QDataStream 没有被刷新到文件中。

我正在处理的文件是中等大小的原始二进制文件(大约 2MB)。

这是一个使用我处理文件的一些代码的最小示例:

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;
}

最佳答案

此答案的第一部分与将文件刷新到磁盘的问题无关。


使用 !fstream.atEnd() 作为 while 的条件不是一个好主意。参见 http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong .我会将 while 循环更改为:

const int block_size = 5;      //The number to read at a time
char lines[block_size];
int len = 0;
while ( (len = fstream.readRawData(lines,block_size)) > 0) {

QByteArray data(lines, len);

//Will process data here once copying works

//Write to the temporary file
ostream.writeRawData(data,data.size());
}

但是,我看不到使用中间 QByteArray 的意义。该循环可以简化为:

while ( (len = fstream.readRawData(lines,block_size)) > 0) {
//Write to the temporary file
ostream.writeRawData(lines, len);
}

如果您需要为其他事情处理QByteArray,构造一个并使用它很好,但调用ostream.writeRawData 不需要使用它.


回复。文件没有被刷新的问题,我建议使用嵌套范围打开文件。该文件应在范围末尾刷新并关闭。

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;
}

// Create a nested scope for the QDataStream
// object so it gets flushed and closed when the
// scope ends.
{
QDataStream ostream(tempfile);

const int block_size = 5; //The number to read at a time
char lines[block_size];
int len = 0;
while ( (len = fstream.readRawData(lines,block_size)) > 0) {

QByteArray data(lines, len);

//Will process data here once copying works

//Write to the temporary file
ostream.writeRawData(lines, len);
}

// The QDataStream should be flushed and
// closed at the end of this scope.
}

process_file(tempfile);
delete tempfile;
}

关于c++ - QDataStream 和 Flush,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com