各フィールドの前に、その長さを示す数字が含まれるファイルを読み取るプログラムを C++ で作成したいと考えています。
問題は、クラスのオブジェクトのすべてのレコードを読み取ることです。クラスの属性を動的にするにはどうすればよいですか?
たとえば、フィールドが「john」の場合、4 文字の配列で読み取られます。
最小メモリ使用量が非常に重要であるため、1000 要素の配列を作成したくありません。
を使用しますstd::string
。これは、割り当てたコンテンツを保持するのに十分な大きさにサイズ変更されます。
ファイルから単語ごとに読みたい場合は、次の操作を実行できます。
vector<string> words;
ifstream fin("words.txt");
string s;
while( fin >> s ) {
words.push_back(s);
}
これにより、ファイル内のすべての単語がベクターに入れられwords
ますが、空白は失われます。
レコード間に空白がないかfile >> record
、ループで書き込むだけだと思います。
size_t cnt;
while ( in >> cnt ) { // parse number, needs not be followed by whitespace
string data( cnt, 0 ); // perform just one malloc
in.get( data[0], cnt ); // typically perform just one memcpy
// do something with data
}
これを行うには、動的割り当てを(直接または間接的に)使用する必要があります。
直接の場合、必要なものnew[]
とdelete[]
:
char *buffer = new char[length + 1]; // +1 if you want a terminating NUL byte
// and later
delete[] buffer;
ブーストの使用が許可されている場合は、を使用してそれを少し単純化できますboost::shared_array<>
。shared_arrayを使用すると、配列ラッパーが自動的にメモリを処理するため、手動でメモリを削除する必要はありません。
boost::shared_array<char> buffer(new char[length + 1]);
std::string
最後に、またはのようなクラスを介して間接的に動的割り当てを行うことができますstd::vector<char>
。