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

覚え書き:TStreamReaderとTStreamWriterの使い方

TStreamReaderとTStreamWriterが便利そうなので試してみた。

まずは、ファイルの読み込みを行うTStreamReader。

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (OpenDialog1->Execute() == false) return;

  std::unique_ptr<TStreamReader> is(new TStreamReader(OpenDialog1->FileName));

  int l = 0;
  UnicodeString Buffer;
  Memo1->Clear();
  Memo1->Lines->BeginUpdate();
  while (is->EndOfStream == false) {
    Buffer = is->ReadLine();
    Memo1->Lines->Add(Format(_T("%4.4d:%s"), ARRAYOFCONST((l, Buffer))));
    ++l;
  }
  Memo1->Lines->EndUpdate();
  is->Close();
}

TStreamReaderは文字コードの判別もある程度はやってくれるみたいだけど、EUC-JPといった特殊なのはやってくれないので、その場合は自前でコード判別&変換の必要あり。
普通に使うのであればfreadやfgets、std::getlineの代替として申し分なし。
TStringList::CommaTextに渡してやれば、CSVファイルのパースがかなり楽になる。

TStreamWriterはエンコーディング方法を指定したり、書式化もしてくれるのでfprintfの代替にうってつけ。

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  if (SaveDialog1->Execute() == false) return;

  UnicodeString Buffer;
  std::unique_ptr<TStreamWriter> os(new TStreamWriter(SaveDialog1->FileName, true, TEncoding::UTF8, 1024));
  for (int i = 0; i < Memo1->Lines->Count; ++i) {
    Buffer = Memo1->Lines->Strings[i];
    os->WriteLine(_T("%4.4d:%s"), ARRAYOFCONST((i, Buffer)));
  }
  os->Close();
}

ここまで便利だとは知らなかった。
# 今更気づいたのか!>俺
でも、2009のリリースノートには無くて、Help Update1のリリースノートにひっそりと書かれていたりするのは何とかしてよ。('A`)
TStreamReaderとTStreamWriterの詳細な使い方は、Delphi 2009 handbook―Delphi最新プログラミングエッセンスに。