覚え書き: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最新プログラミングエッセンスに。