2016-07-01 4 views
-2

私の問題:テキストファイルからの入力を配列または変数に格納しますか?

私はプログラミングに新しいおよびC++でプログラムを作成しようとする非常に新しいです、私は、テキストファイルを持っています。 *テキストファイルには、Students Name、Grade、Grade Letterが保存されています。

Jill Hamming A 96 
Steven Jenning A 94 
Tim Sutton B 89 
Dillon Crass C 76 
Sammy Salsa D 54 
Karen Poulk D 49 

私はすべて保存したい:私は彼らがテキストファイルは次のようになり すなわち....私は配列に個別にそれらを保存したい

*配列に異なる種類として保存したいです1つの配列のファーストネーム、別の配列のファーストネームなど。 これらの配列は後で生徒用のオブジェクトに割り当てられます。たぶん最大500人の学生。

そこで質問:

代わりに500個の変数を使用しての配列にテキストドキュメントからの入力を格納する方法。

ie。ここに私の試みです。

int main() 
{ 
/// the input is all different types, strings, ints and chars 
string my_First_Name[500], my_Last_Name[500]; 
int my_grade[500]; 
char my_letter[500]; 

ifstream myfile("input.txt"); 
if (myfile.is_open()){ 

     for (int i = 0; i < 500; i++) { 
     myfile >> my_First_Name[i] >> my_Last_Name[i] >> my_grade[i] >>   my_letter[i]; 


     } 
     // much later and irrelevent part but just showing because this is what I want to do. where Student Class exsists somewhere else. yet to be programmed. 
    Student myStudent [500]; 
    myStudent[i].Grades = my_grade[i]; 
    myStudent[i].LetterGrade = my_letter[i]; 
    } 
myfile.close(); 
//Exit 
system("pause"); 
return 0; 

} 

いつ私が持っていたものを印刷するか。私はそれが初期化されていないことを意味するすべての負と奇妙な数字を持っていた。どこで私は間違えましたか?

+0

'struct'を使って' std :: vector'に格納します。 –

+0

あなたは学年の初めから学年の挨拶をしますが、あなたが見せるファイルの内容には反対の方向があります。 –

+0

それはすべて無責任です、私は私がしたようにあなたがなぜそれをアレイに保管することができないのだろうと思っていました。私は使用されたstd :: vectorを一度も使用していません。どのようにベクトルvs配列の格納に役立つだろうか? –

答えて

0

同じサイズのアレイが複数ある場合は、通常、デザインが悪い兆候となります。

経験則レコード(またはデータの行を)持っているクラスまたは構造によって表される:

struct Record 
{ 
    string first_name; 
    string last_name; 
    int grade_value; // Can this go negative? 
    string grade_text; 
}; 

あなたは500を持ってしようとしているわかっている場合、あなたはのための配列を作成することができますデータ:

#define ARRAY_CAPACITY (500) 
Record grades[ARRAY_CAPACITY]; 

これではない偉大なソリューション、あなたが500未満がある場合、スペースを無駄にし、バッファオーバーランを実行するので、あなたがこのように以上500

を読めば、よりよい解決策を使用することですstd::vectorを使用すると、読んだレコードを追加することができます。 std::vectorは、レコードを格納するために必要に応じて展開されます。配列では、新しい配列を割り当て、古いレコードを新しい配列にコピーしてから、古い配列を削除する必要があります。

また、良い解決策には、入力ストリームからデータメンバーを読み取るためのメソッド、Recordが含まれます。研究 "オーバーロードストリーム抽出演算子"。あなたはstackoverflowのを検索して、この情報を見つけることができ

Record r; 
while (input_file >> r) 
{ 
    student_grades.push_back(r); 
} 

あなたの入力ループは次のようになります。最初の良い検索は、 "stackoverflow C++ read file space separated"または "comma separated"または "stackoverflow C++ read file structure"です。あなたはアレルギーや配列に限定されている場合

std::vector<Record> student_grades; 
Record r; 
while (input >> r.first_name >> r.last_name >> r.grade_value >> r.grade_text) 
{ 
    student_grades.push_back(r); 
} 

は、アレイとカウンタを使用する必要があります:あなたはこのような何かにループを展開することができ
レコードを読み取る

。私たちは、ファイル内にあるレコード数をプログラムが読み取ることを唯一の最大値を知らないので

#define MAXIMUM_RECORDS (500) 
Record r; 
Record grade_book[MAXIMUM_RECORDS]; 
unsigned int record_count = 0U; 
while (input >> r.first_name >> r.last_name >> r.grade_value >> r.grade_text) 
{ 
    grade_book[record_count] = r; 
    ++record_count; 
    if (record_count >= MAXIMUM_RECORDS) 
    { 
    break; 
    } 
} 

forループが使用されていません。ファイルに600のレコードがある場合、500だけが読み取られます。

関連する問題