这是有关在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和冲洗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45572181/

10-09 05:59