C++Builderでテキストファイルを一行ずつ読み込む方法を紹介します。
大きなファイルを読み込むのであれば、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();
一行ごとに配列に入れるなら、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はファイルのデータをまとめてメモリーに読み込みます。
扱いやすい反面、サイズの大きなファイルを読み込むと大量のメモリーを消費します。
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;
}