既存のテキストファイルに対して、文字列を追記する方法を紹介します。
サンプルコードでは、文字コードUTF8で追記しています。
■TStringList
TStringListでテキストファイルの内容を読み込み、読み込んだ内容に文字列を追加してファイルに書き出します。
テキストファイルのデータが大きいと処理に時間とメモリを消費します。
unique_ptr<TStringList> sl(new TStringList());
sl->LoadFromFile(L"C:\\test.txt");
sl->Add(L"テスト1");
sl->SaveToFile(L"C:\\test.txt", TEncoding::UTF8);
//=>テスト1\r\n
■TFileStream
TFileStreamでテキストファイルを開き、末尾に移動して、文字列を追加して保存します。
文字列を一度バイト列に変換して、ストリームに追加します。
unique_ptr<TFileStream> fs(new TFileStream(L"C:\\test.txt", fmOpenReadWrite));
fs->Seek(0, soFromEnd);
UTF8String utf8 = L"テスト2";
fs->Write(utf8.c_str(), utf8.Length());
//=>テスト2
■TStreamWriter
TStreamWriterでテキストファイルを開き、追記します。
TStreamWriterが出力する文字コードの初期値はUTF8なので、文字コードの指定は省略できます。
unique_ptr<TStreamWriter> sw(new TStreamWriter(L"C:\\test.txt", true, TEncoding::UTF8, 1024));
//unique_ptr<TStreamWriter> sw(new TStreamWriter(L"C:\\test.txt", true));
sw->Write(UnicodeString(L"テスト3"));
//=>テスト3
sw->WriteLine(UnicodeString(L"テスト4")); //改行付き
//=>テスト4\r\n
sw->Close();
TStreamWriterはコンストラクタの引数にTStream*を受け取ることもできます。
unique_ptr<TFileStream> fs(new TFileStream(L"C:\\test.txt", fmOpenReadWrite));
unique_ptr<TStreamWriter> sw(new TStreamWriter(fs.get()));
sw->Write(UnicodeString(L"テスト5"));
sw->WriteLine(UnicodeString(L"テスト6"));
sw->Close();
■IOUtils.TFile.AppendAllText
IOUtils.TFile.AppendAllTextは、ファイルに文字列を追加する関数です。
引数に、ファイルのパス・追加する文字列・エンコードを指定します。
#include <IOUtils.hpp>
TFile::AppendAllText(L"C:\\test.txt", L"テスト7", TEncoding::UTF8);
TFile::AppendAllText(L"C:\\test.txt", L"テスト8", TEncoding::UTF8);
//=> テスト7テスト8
やはり最近導入されたクラスTStreamWriterやIOUtilsユニットが使いやすいです。
更新履歴
- 2011年12月29日 公開した。
- 2012年1月27日 IOUtils.TFile.AppendAllTextの記述を追加した。