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