Top / Programming / C++Builder / テキストファイルを一行ずつ読み込む

テキストファイルを一行ずつ読み込む

C++Builderでテキストファイルを一行ずつ読み込む方法を紹介します。

TStreamReader

大きなファイルを読み込むのであれば、C++Builder 2010以降ならTStreamReaderクラスのReadLine()メソッドを使用すると、効率よく読み込むことができます。

UnicodeString filename = "C:\\test.txt";  //ファイル名
TEncoding* enc = TEncoding::Default;  //使用する文字エンコーディング
bool detectBOM = false; //ファイルの先頭にあるバイト順序マークを検索するかどうか
int bufferSize = 1024;

std::unique_ptr<TStreamReader> reader(new TStreamReader(filename, enc, detectBOM, bufferSize));
while (reader->EndOfStream == false) {
  UnicodeString text = reader->ReadLine(); //1行読み込む
  std::wcout << text.c_str() << std::endl;
}
reader->Close();

TFile::ReadAllLines

一行ごとに配列に入れるなら、IOUtilsユニットのTFile::ReadAllLines関数を使います。

#include <IOUtils.hpp>

UnicodeString filename = "C:\\test.txt";  //ファイル名
TEncoding* enc = TEncoding::Default;  //使用する文字エンコーディング
TStringDynArray array = TFile::ReadAllLines(filename, enc);
for (int i = 0; i < array.Length; ++i) {
  UnicodeString text = array[i]; //1行読み込む
  std::wcout << text.c_str() << std::endl;
}

TStringList

TStringListはファイルのデータをまとめてメモリーに読み込みます。

扱いやすい反面、サイズの大きなファイルを読み込むと大量のメモリーを消費します。

UnicodeString filename = "C:\\test.txt";  //ファイル名
TEncoding* enc = TEncoding::Default;  //使用する文字エンコーディング

std::unique_ptr<TStringList> list(new TStringList());
list->LoadFromFile(filename, enc);
for (int i = 0; i < list->Count; ++i) {
  UnicodeString text = list->Strings[i]; //1行読み込む
  std::wcout << text.c_str() << std::endl;
}

更新履歴