在项目中,我需要从文件中读取二进制数据并使用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
答案 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;
}