2016-01-21
Qtでファイルからデータを読み込むには、QFileクラスを使用します。バイト配列ならQBufferが利用できます。どちらも、QIODeviceの派生クラスです。既にメモリ上にデータが存在している状態で、QIODeviceの皮をかぶせてデータを読み取りたい場合、一つの方法は、QBuffer::setData()を使用するやり方です。
QBuffer b;
b.setData("Hello, world", 12);
普通の用途ならこれで良いのですが、これだと、QBufferの内部でQByteArrayが作られて、データのコピーが発生しますので、内部の仕組みを知ってしまうと、この方法は使いたくなくなります。そこで、余計なコピーを行わずに、直接メモリから読み取るQIODevice派生クラスを作ってみました。
MemoryReader.h
MemoryReader.cpp
読み取り専用なので、書き込みはサポートしません。
#include "MemoryReader.h"
int main(int argc, char *argv[])
{
MemoryReader r;
r.setData("Hello, world", 12);
if (r.open(MemoryReader::ReadOnly)) {
char tmp[2];
tmp[1] = 0;
while (r.getChar(tmp)) {
qDebug(tmp);
}
}
return 0;
}