前回の改善版。GTKmmに含まれるgiommを利用してファイル書き込みした。
入手先
開発環境
- Windows XP Pro SP3 32bit
- VC++ 2010 Express
ライブラリ
コード
MyWindow.h
MyWindow.cpp
ファイル形式
- UTF-8
- BOM無し
- 改行コード:LF
出力したファイルは上記のようになった。
WindowsからみるとBOM付、CR+LFのほうが都合がいい。 でも、設定する関数が見当たらない。
改行コードは自前で挿入するっぽい。
m_doStream->put_string(m_entry.get_text());
m_doStream->put_string("\n");
\n
を\r\n
にするとCR+LFになる。
C言語標準関数のfprintf
や、STLのfstream
なら、Windows環境で\n
とすると自動で\r\n
になる。
でも、Gio::DataOutputStream::put_string
は自動で変換しないらしい。
おそらくBOMも自前で挿入する必要があるのだろう。
DataInputStream
ちなみに、Gio::DataInputStreamクラスにはset_newline_type関数があった。 DataOutputStreamにも欲しかった。
enum Gio::DataStream NewlineTypeを引数にする。値は以下の通り。
- DATA_STREAM_NEWLINE_TYPE_LF
- DATA_STREAM_NEWLINE_TYPE_CR
- DATA_STREAM_NEWLINE_TYPE_CR_LF
- DATA_STREAM_NEWLINE_TYPE_ANY
ファイルを開く
m_file = Gio::File::create_for_path(m_filePath);
Gio::File::create_for_path
はファイルの相対パスまたは絶対パスからGio::Fileインスタンスを生成するらしい。
ファイルパスが既存なら、とくに何もしていないと思う。 自動でリネームして別ファイルを作成するようなことはしていない。
モードを指定する
//m_foStream = m_file->create_file(); // 新規作成
//m_foStream = m_file->replace(); // 上書き
m_foStream = m_file->append_to(); // 追記
コメントにあるように、ファイルのオープンモードごとに関数を使い分ける。
型を指定して出力する
m_doStream = Gio::DataOutputStream::create(m_foStream);
m_doStream->put_string(m_entry.get_text());
m_doStream->put_string("\n");
以下のようなデータ型に対応している。
bool put_byte(guchar);
bool put_int16(gint16 data);
bool put_uint16(guint16 data);
bool put_int32(gint32 data);
bool put_uint32(guint32 data);
bool put_int64(gint64 data);
bool put_uint64(guint64 data);
bool put_string(std::string str);
バイトオーダーを指定する
今回は利用していないが、ファイル出力時、バイトオーダーを指定できるらしい。
Gio::DataOutputStream::set_byte_order(DataStreamByteOrder);
- Gio::DATA_STREAM_BYTE_ORDER_BIG_ENDIAN
- Gio::DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN
- Gio::DATA_STREAM_BYTE_ORDER_HOST_ENDIAN
ビッグエンディアンとリトルエンディアンに対応しているらしい。 これでOSごとに異なるバイトオーダーに対応できそう。
おそらくデフォルトはホスト(実行環境)のエンディアンを使っているのだろう。 .NET Framework 4では自前でバイナリ操作しないとビッグエンディアンにできなかった記憶がある。 GTKはマルチプラットフォームで動作することを意識しているから標準装備しているのだろう。頼もしい。
所感
前回と違い、C++を使えた。 前々回と違い、マルチスレッドでも実行エラーなく動作する。GTKmm環境ではこれが最善か。Boostは不要。
でも、改行コードとBOMは試しておきたい。