読者です 読者をやめる 読者になる 読者になる

やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GTKmmでUTF8ファイル書込する(Gio::DataOutputStream)

前回の改善版。GTKmmに含まれるgiommを利用してファイル書き込みした。

Window

入手先

GitHub MEGA

開発環境

ライブラリ

コード

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や、STLfstreamなら、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は試しておきたい。