不读取文件中的所有二进制数据

时间:2017-12-11 10:49:59

标签: c++ qt qfile qbytearray

在项目中,我需要从文件中读取二进制数据并使用gzip进行解压缩。问题是QFile::readAll()实际上并没有读取所有字节,也没有报告任何错误。

这是我的代码:

QFile ifile("/tmp/currentAlmanac.gz");
qDebug() << "File Size:" << ifile.size();

ifile.open(QIODevice::ReadOnly);
QByteArray data = ifile.readAll();
ifile.close();
qDebug() << "Almanac Size:" << data.size();

输出结果为:

  

文件大小:78637
  年历大小:78281

我有什么问题吗?

有足够的空闲内存。

规格:Ubuntu16.04上的Qt5.10

1 个答案:

答案 0 :(得分:0)

  

我需要从文件中读取二进制数据

我没有很多Qt的经验,但是很容易将大型二进制文件读入内存,然后你可以将它传递给gzip进行解压缩。你可以尝试这样的事情。使用像std::deque这样的容器将文件存储在内存中,因为它很大,不需要像std::vector那样在连续的空间中分配。

// set the chunk size to be the maximum I/O unit for your machine*
const size_t chunk_size = static_cast<size_t>(32768);
std::deque<uint8_t> bytes;  // store the whole file
std::vector<uint8_t> chunk(chunk_size, 0);  // temporary file chunk

std::ifstream dataFile;
dataFile.open( fileName.c_str(), std::ios::in | std::ios::binary );

if ( dataFile.is_open() )
{
    // read entire file large chunks at a time
    while ( dataFile.read(reinterpret_cast<char*>(&chunk[0]),
                          chunk.size()) ||
            dataFile.gcount() )
    {
        // append each chunk to our data store
        bytes.insert(bytes.end(),
                     chunk.begin(),
                     chunk.begin() + dataFile.gcount());
    }

    dataFile.close();  // close the file when we're done
}
else
{
    std::cerr << "Failed to create file stream on ->" << fileName << "<-" << std::endl;
}