それは本当にあなたがテキストを解析しようとしている方法に依存します。これを行う1つの方法は、データを文字列のベクトルに読み込むことです。スケーリング性やメモリの使用などの問題については、すでに説明していると思います。
std::vector<std::string> lines;
std::string line;
ifstream file(filename.c_str(), ios_base::in);
while ( getline( file, line ) )
{
lines.push_back( line );
}
file.close();
これにより、ファイルがにキャッシュされますlines
。次に、行を通過する必要があります
for ( std::vector<std::string>::const_iterator it = lines.begin();
it != lines.end(); ++it)
{
const std::string& line = *it;
if ( line.empty() )
continue;
switch ( line[0] )
{
case 'g':
// Some stuff
break;
case 'v':
// Some stuff
break;
case 'f':
// Some stuff
break;
default:
// Default stuff including '#' (probably nothing)
}
}
当然、これは非常に単純であり、ファイルで何をしたいかに大きく依存します。
例として挙げたファイルのサイズは、IOストレスを引き起こす可能性はほとんどありませんが(非常に軽量な機器を使用している場合を除く)、一度に多数のファイルを読み取る場合は、問題になる可能性があります。
ここでのあなたの懸念はIOを最小化することだと思います。コレクションを2回繰り返すことになるので、このソリューションが本当に役立つかどうかはわかりません。戻って同じファイルを何度も読み続ける必要がある場合は、ファイルをメモリにキャッシュするための速度が確実に向上しますが、ファイルのメモリマッピングや通常のファイルの使用など、これを行う簡単な方法があります。アクセス。本当に心配な場合は、IOから読み取るときにファイルを直接処理するのではなく、このようなソリューションのプロファイリングを試してください。