C++Builder は、ファイルの読み込みがとても簡単で、TStringList::LoadFromFile() により、文字コードを適切に処理して読み込んでくれる。

LoadFromFile() は見ただけで使い方が分かる。しかし、その親戚である、メモリからの読み込みを行う LoadFromStream() については、まとまった説明が見当たらなかったので試行錯誤。

で、以下が結果のコード。メモリに格納されている文字列を、文字コードを指定して TStringList に読み込む。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    const char                  UTF8_STR[] = { 0xE6, 0x98, 0xA5 };
    unique_ptr<TMemoryStream>   aMemStream(new TMemoryStream());
    unique_ptr<TStringList>     aStrList(new TStringList());

    aMemStream->Write(UTF8_STR, 3);
    aMemStream->Seek(static_cast<long>(0), soBeginning);
    aStrList->LoadFromStream(aMemStream.get(), TEncoding::UTF8);
    ShowMessage(aStrList->Text);
}


UTF8_STR が文字列が格納されているメモリ領域。今回は定数にしてあるが、通常は、どこかから持ってきた内容を格納しているバッファになる。

TStringList::LoadFromStream() は、TStream 型(の派生クラス)からしかデータを読み出せない。メモリ領域をそのまま読むことはできないので、仲介役の TMemoryStream が必要になる。

TMemoryStream にメモリ領域の内容を書き込んでいるのが aMemStream->Write(UTF8_STR, 3); TMemoryStream にメモリ領域の内容を読み込むというイメージだったので、最初 Read() を使いそうになってしまったが、Write() なので注意。

Write() 後に、読み書き位置を先頭に戻しておく。

あとは、LoadFromStream() に TMemoryStream へのポインタを渡せば、文字列が読み込まれる。

文字コードの指定は、
  • UTF-8……TEncoding::UTF8
  • UNICODE(UTF-16)……TEncoding::Unicode
  • 指定無し……自動判別
など。TEncoding についてはここが詳しい。

以上、コードを実行すると、メモリ領域から 3 バイトを読み取って、「春」を取得できる。

LoadFromStream