0

これは初心者の C++ 宿題の問題です。ベクトルについては知っていますが、この課題では使用できません。array[]調べてみるとサイズ不明の の作り方も出てきました。しかし、それは少しトリッキーです(一種)。私が読んだ例は、すべて次の行に沿っています: 入力を取得し、その入力に基づいて配列を作成します (サイズ n)。

この学生クラスを作成しましたが、array保存するために が必要です。何人の生徒が来るかは前もってわかりません。各生徒が 1 行にテキスト ファイルを入力するだけです。フォーマットは以下のとおりです。サンプルは約 5 ですが、先生が私のプログラムをテストするためにどれだけ使用するかはわかりません。

次のような入力ファイル:

George Chan Computer_Science New York 23
Johnny Chan Computer_Science New Jersery 22
....

しかし、問題は、テキスト タイル全体を読み終えるまで、そこにいる生徒の数がわからないことです (または、それを行う他の方法があるかどうかわかりません)。私の現在のアプローチは、それを行ごとに読み取り、カウンターをインクリメントして、studentCounter終了するまで作成してから、Student* myRoster = Student[studentCounter]. しかし、ファイルの読み取りを再開する必要がある場合。行ごとに情報を解析し、Studentオブジェクトを作成して、myRoster[x]それを指すようにします。丁度良いサイズにするために、作業を 2 回行っているような気がします。私が見逃しているトリックやものはありますか?

ありがとうございました。

4

3 に答える 3

4

再帰を使用した簡単なアプローチの 1 つを次に示します。

Student* readStudents(istream& infile,int& n_students)
{
  string line = readLine(infile);
  if (!infile) {
    return new Student[n_students];
  }
  int index = n_students++;
  Student* students = readStudents(infile,n_students);
  students[index] = parseLine(line);
  return students;
}

次に、次のように呼び出します。

int n_students = 0;
Student* students = readStudents(infile,n_students);

アイデアは、再帰を深く掘り下げて行を読むことです。ファイルの最後に到達するまでに、何人の学生を割り当てる必要があるかがわかるので、再帰から抜け出すときに、行を解析して配列を逆の順序で埋めることができます。また、出力パラメーターを介して返される学生の数も取得します。

于 2012-04-12T05:14:21.530 に答える
1

あなたが十分に野心的であるなら、あなたとほぼ同じことをすることができますvector-いくつかのスペースを割り当て、使用しているそのスペースの量を追跡し、それがいっぱいになったとき/場合は、より大きなチャンクを割り当てます(次のようなもの) 1 1/2 または 2 倍の大きさ)、前のブロックから新しいブロックにデータをコピーし、新しいデータを新しいブロックに挿入し始めます。必要に応じて繰り返します。

于 2012-04-12T05:04:38.960 に答える
0

入力ファイルはあなたが定義したものですか、それとも演習用に定義したものですか?

ファイルの構造を定義する場合、2 つの選択肢があります。あなたはどちらかできます

a) フィールドの長さを 2 倍にしてから、ファイル サイズを取得し、除算を行ってアイテムの数を取得します。

また

b) 最初の行には、ファイル内の項目数が格納されます。

于 2012-04-12T05:10:57.530 に答える