2011年12月3日土曜日

( Qt C++ )バイナリデータの書き込み



はい、今日でC++ GUI Programming with Qt4は6日目です。
特に変わらずに基本的事項を頭に入れていっています。こちらはあと2日で終わりそうです。

さて、今日からは表題のような、よく使う,ファイルの入出力関係をメモしていこうと思います。
今日はバイナリデータの書き込みです。うだうだ書くより実践です。まずはコード

(C++ GUI Programming with Qt4 274ページより)

QImage image("philip.png");

QMap<QString, QColor> map;
map.insert("red", Qt::red);
map.insert("green", Qt::green);
map.insert("blue", Qt::blue);

QFile file("facts.dat");

if (!file.open(QIODevice::WriteOnly)) //オープン成功か失敗か
{
    return;
}

QDataStream out(&file);//バイナリ読み書きに使う
out.setVersion(QDataStream::Qt_4_1);//version番号。定数を入れても良い。
out << quint32(0x12345678) << image << map;


このコードはint, QImage, QMap<QString, QColor>をfacts.datという出力するというもの。最初のほうはただの宣言類ですので、今回の理解にはあまり重要ではありません。

out.setVersion(QDataStream::Qt_4_1)のところは、違うバージョンで読むときを考えてQDataStream::Qt_3_0などと記述することもできます。バージョンの違いにより読込に影響をあたえることがあるのでここは注意が必要です。

で最後に out << quint32(0x12345678) << image << mapと書いて書き込んでいますが、ここでquint32( ... )しているのは整数をどのOSでも正確に符号なし32ビット値として書き込まれるようにするためだそうです。

QDataStreamはデフォルトでデータをビックエンディアンで格納するそうです。またバイトオーダはsetByteOrder()で変更が可能だそうです。以下リファレンスより、

void QDataStream::setByteOrder ( ByteOrder bo )

The bo parameter can be QDataStream::BigEndian or QDataStream::LittleEndian.

(boにはどっちかいれろよ。みたいな意味)

 

以上です。 次回はバイナリ読込をメモ。