2016-04-27 25 views
-1

コードを変更しました。プログラムはstudents.txtファイルを正しく読み込みますが、学生の代わりにユーザー入力から計算しました。バグのTXT
の#include の#include の#include の#include の#include の#include の#include の#includeテキストファイルからクラス内のオブジェクトベクトルへの読み込み - 別のtxtファイルへの書き込み

using namespace std; 

//Declaring class Student 

class Student 
{ 
private: 

    string newName; 
    int newScore1; 
    int newScore2; 
    int newScore3; 
    float newFinal; 

public: 
    // No argument constructors 
    Student() 

{ 
    newName  = " "; 
    newScore1 = 0; 
    newScore2 = 0; 
    newScore3 = 0; 
    newFinal = 0.00; 

} 
//all arguements constructors 
Student (string name, int score1, int score2, int score3, float final) 

{ 
newName  = name; 
newScore1 = score1; 
newScore2 = score2; 
newScore3 = score3; 
newFinal  = final; 
} 
//getters 
string getName() const 
{ 
    return newName; 
} 
int getScore1() const 
{ 
return newScore1; 
} 
int getScore2()const 
{ 
return newScore2; 
} 
int getScore3()const 
{ 
return newScore3; 
} 

float getFinal() const 
{ 
    return newFinal; 
} 

//Setters 
void setName(string name) 
{ 
    newName = name; 
} 
void setScore1(int score1) 
{ 
newScore1=score1; 
} 
void setScore2(int score2) 
{ 
    newScore2=score2; 
} 
void setScore3 (int score3) 
{ 
newScore3 = score3; 
} 

void setFinal (float final) 
{ 
    newFinal = final; 
} 


}; 
//asks for number of students, 
// function asks for input to fill in vector 
//sorts the inputs to get max 2 scores out of 3 
//puts the data in a vector of class Student 
//Sends data to a text file students.txt 
void fillvector(vector <Student>& newMyClass) 

{ 
string name; 
float score1; 
float score2; 
float score3; 
float final; 
float tmp; 
cout << "Please enter the number of Students: " << endl; 
int classSize; 
cin >> classSize; 
for (int i = 0; i < classSize; i ++) 
    { 
    cout << "Enter Student's name" << endl; 
    cin >> name; 
    cout << "Enter Student's Score 1" << endl; 
    cin >> score1; 
    cout << "Enter Student's Score 2" << endl; 
    cin >> score2; 
    cout << "Enter Student's Score 3" << endl; 
    cin >> score3; 
    if(score1>score2) 
    { 
     float tmp = score1; 
     score1 = score2; 
     score2 = tmp; 
    } 
    if(score1>score3) 
    { 
    float tmp = score1; 
    score1=score3; 
    score3 = tmp; 
    } 
    if(score2>score3) 
    { 
    float tmp = score2; 
    score2=score3; 
    score3=tmp; 
    } 

    final = (score2+score3)/2; 

    Student newStudent (name, score1, score2, score3, final); 
    newMyClass.push_back(newStudent); 
    cout << endl; 

    ofstream myfile; 
    myfile.open ("students.txt", std::ofstream::out |std::ofstream::app); 
    myfile << name<< setw(5)<< score1<< setw(5)<<score2<<setw(5) <<score3<<setw(5)<<final<<setw(5)<<endl; 
    myfile.close(); 
    cout << "Copied to students.txt" << endl; 


    } 
    cout << endl; 
} 
//reads data from textfile students.txt 
//calculated teh minimum scores and maximum scores 
//sends the minimum and maximum scores to text file Results.txt 
void readToVector(vector <Student>& newMyClass) 

{ 
    string name; 
float score1; 
float score2; 
float score3; 
float finalScore; 
Student newStudent (name, score1, score2, score3, finalScore); 
unsigned int size = newMyClass.size(); 
ifstream fin("students.txt"); 
if (fin.is_open()) 
    {cout << "File open" << endl; 
    while(fin >> name >> score1 >> score2 >> score3 >> finalScore) 
     { 
    newStudent.setName(name); 
    newStudent.setScore1(score1); 
    newStudent.setScore2(score2); 
    newStudent.setScore3(score3); 
    newStudent.setFinal(finalScore); 
    newMyClass.push_back(newStudent); 
    //cout << newStudent.getName() << newStudent.getFinal() << endl; 

     } 
    fin.close(); 
    cout << endl; 
    Student studWMaxScore = newMyClass[0]; 
    float maxscore = studWMaxScore.getFinal(); 

for (unsigned int i =0; i < size; i++) 
{ 
    if (maxscore < newMyClass[i].getFinal()) 
    { 
    maxscore = newMyClass[i].getFinal(); 
    studWMaxScore = newMyClass[i]; 

    } 

} 
cout << "Maximum Score is " << maxscore << endl; 
    ofstream myfile; 
    myfile.open ("Result.txt", std::ofstream::out ); 
    myfile << "Maximum Score" << endl; 
    myfile << maxscore << endl; 
    myfile << "Name of the student with maximum score is " << endl; 
    myfile << studWMaxScore.getName() << endl << endl; 
    // myfile.close(); 
    cout << "Copied to Results.txt" << endl; 

Student stuWMinScore = newMyClass[0]; 
float minscore = stuWMinScore.getFinal(); 
for (unsigned int i =0; i < size; i++) 
{ 
    if (minscore > newMyClass[i].getFinal()) 
    { 
     minscore = newMyClass[i].getFinal(); 
     stuWMinScore = newMyClass[i]; 

    } 
} 
cout << "Minimum Score is " << minscore << endl; 
// ofstream myfile; 
// myfile.open ("Result.txt", std::ofstream::out); 
myfile << "Mimimum Score" << endl; 
myfile << minscore << endl; 
myfile << "Name of the student with minimum score is " << endl; 
myfile << stuWMinScore.getName() << endl << endl; 
// myfile.close(); 
cout << "Copied to Results.txt" << endl; 
    } 
else 
    cout << "file in not open" << '\n'; 

} 


//prints out the name and scores of each student 
void printVector (const vector<Student>& newMyClass) 

{ 
unsigned int size = newMyClass.size(); 
for (unsigned int i =0; i < size; i++) 

    { 
cout << "Student name is: "<< newMyClass[i].getName() << endl; 
cout << "Student Score 1 is "<< newMyClass[i].getScore1()<< endl; 
cout << "Student Score 2 is "<< newMyClass[i].getScore2()<< endl; 
cout << "Student Score 3 is "<< newMyClass[i].getScore3()<< endl; 
cout << "Student Final Score is " << newMyClass[i].getFinal() << endl; 
cout << endl; 
    } 

} 




int main() 

{ 
vector <Student> myClass; 
fillvector (myClass); 
readToVector(myClass); 
    printVector(myClass); 
} 
+0

機能の一部を切断しました。最小値と最大値はどこで計算されますか? students.txtはプログラムと同じディレクトリにありますか? – Stephen

+0

より完全なコード(Studentクラスを含む)とstudents.txtファイルの例を提供してください。 – steiner

+0

こんにちは、応答してくれてありがとう、私はクラス定義と最小最大計算を追加しました。 –

答えて

0

コアはここになりそうだ。

インデントが固定されたら
while(fin >> name >> score1 >> score2 >> score3 >> finalScore) 
{ 
    newStudent.setName(name); 
    newStudent.setScore1(score1); 
    newStudent.setScore2(score2); 
    newStudent.setScore3(score3); 
    newStudent.setFinal(finalScore); 
} 
fin.close(); 
newMyClass.push_back(newStudent); 

、それはnewStudentだけで、ファイルが完全に読み込まれた後、ベクターに押し込まれることを確認するのは簡単です。 OPは最後の生徒をベクターに入れるべきですが、他の生徒はいないはずです。 OPはおそらく、ベクター内のファイルにすべての学生を望んでいるので、

while(fin >> name >> score1 >> score2 >> score3 >> finalScore) 
{ 
    newStudent.setName(name); 
    newStudent.setScore1(score1); 
    newStudent.setScore2(score2); 
    newStudent.setScore3(score3); 
    newStudent.setFinal(finalScore); 
    newMyClass.push_back(newStudent); <- moved push_back to here 
} 
fin.close(); <- probably not necessary 

は、コードの残りの部分を確認することはできませんだけ size --Cromの定義または割り当てがあるようには思えないので、ループ用のものが正しい地面をカバーしているかどうか、または入力ファイルがないため入力の妥当性を知ることができます。解析ルールが間違っていると、OPはまったく何も読み取っていない可能性があります。デバッガは、他のスタックオーバーフローポストよりもはるかに速くそれを把握するでしょう。 (これ以降、営業担当者がこれに対処している)

新しいもの。

なぜ入力が解析されないのかわかりません。まず、ファイルがASCIIテキストとしてエンコードされていることを確認します。私はあなたのコンピュータでこれを行う必要があるツールを知りません。私は16進エディタを使用して、キャラクタが予想されるASCII値と一致していないかどうかを調べるために、文字ではなくバイト値でファイルを見ることができます。テキストエディタがあなたのために変換して、その違いを隠しているかもしれません。

たとえば、多くの場合、UTF-8でエンコードされたファイルは、UTF-8ファイルであることをリーダプログラムに知らせる最初のマーキングでバイナリのビットを除いてASCIIファイルとまったく同じに見えます。 ASCII。

そうでない場合、問題があります。ファイルをASCIIファイルとして再保存します。それがASCIIファイルの場合、最小化する時間。ファイルを開いてトークンでトークンを読み取り、どのトークンが解析に失敗したかを調べる小さなプログラムを作成します。

int main() 
{ 
    ifstream fin("students.txt"); 
    if (fin.is_open()) 
    { 
     int line = 0; 

     while(true) // loop forever 
     { 
      line++; 
      if (!fin >> name) 
      { 
       std::cout << "Could not read name on line " << line << std::endl; 
       break; // exit loop 
      } 
      if (!fin >> score1) 
      { 
       std::cout << "Could not read score1 on line " << line << std::endl; 
       break; 
      } 
      if (!fin >> score2) 
      { 
       std::cout << "Could not read score2 on line " << line << std::endl; 
       break; 
      } 
      if (!fin >> score3) 
      { 
       std::cout << "Could not read score3 on line " << line << std::endl; 
       break; 
      } 
      if (!fin >> finalScore) 
      { 
       std::cout << "Could not read finalScore on line " << line << std::endl; 
       break; 
      } 
     } 
    } 
    else 
    { 
     std::cout << "Could not open file" << std::endl; 
    } 
} 

ファイルがどこで失敗したかを知ったら、新しい質問をするのがよいでしょう。この1つはあまりにも多すぎます。

+0

ありがとう、私はwhileループにpush_backを移動しようとしましたが、結果には影響しません。それはまだresult.txtへのユーザー入力だけを読み取っています。 –

+0

サイズはno。私はnewMyClass.size()を使ってみました。サイズを取得する。 –

+0

開発環境のデバッガでコードを実行すると、whileループを入力することはありますか?それとも、やあ、古い学校に行く。 whileループの中にcoutを入れて、学生の名前を印刷します。あなたの入力ファイルには名前も生徒も解析ルールも間違っています。 – user4581301

関連する問題