1

各フィールドの前に、その長さを示す数字が含まれるファイルを読み取るプログラムを C++ で作成したいと考えています。

問題は、クラスのオブジェクトのすべてのレコードを読み取ることです。クラスの属性を動的にするにはどうすればよいですか?

たとえば、フィールドが「john」の場合、4 文字の配列で読み取られます。

最小メモリ使用量が非常に重要であるため、1000 要素の配列を作成したくありません。

4

4 に答える 4

3

を使用しますstd::string。これは、割り当てたコンテンツを保持するのに十分な大きさにサイズ変更されます。

于 2010-04-24T19:09:32.600 に答える
2

ファイルから単語ごとに読みたい場合は、次の操作を実行できます。

vector<string> words;
ifstream fin("words.txt");
string s;
while( fin >> s ) {
    words.push_back(s);
}

これにより、ファイル内のすべての単語がベクターに入れられwordsますが、空白は失われます。

于 2010-04-24T19:15:17.690 に答える
1

レコード間に空白がないか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
}
于 2010-04-24T19:24:12.750 に答える
1

これを行うには、動的割り当てを(直接または間接的に)使用する必要があります。

直接の場合、必要なもの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>

于 2010-04-24T19:25:15.080 に答える