2016-04-27 70 views
-1

我已经更改了代码,现在程序正确读取了te文件形式的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

请提供更完整的代码(包括学生课程)和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可能完全没有读取任何内容。调试器会比另一个堆栈溢出帖子更快地计算出来。 (OP已经解决了这个问题)

新的东西。

我不明白为什么输入不解析。首先确保文件编码为ASCII文本。我不知道你必须在你的电脑上做什么工具。我使用十六进制编辑器,可以让您以字节值而不是字符查看文件,以查看这些字符是否与预期的ASCII值不匹配。文本编辑器可能会为您转换并隐藏其中的差异。

例如,UTF-8编码的文件通常看起来与ASCII文件完全相同,只是在开始标记处有一点二进制文件,告知读者程序它是一个UTF-8文件, 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; 
    } 
} 

一旦你知道文件失败的位置,你很有可能提出一个新的问题。这一个蔓延太多了。

+0

谢谢,我试着将push_back移到while循环中,并不影响结果。它仍然只读取用户对result.txt的输入 –

+0

由于大小由no。的用户输入的学生,我已经尝试使用newMyClass.size();以获得大小。 –

+0

当你使用开发环境的调试器运行你的代码时,你是否曾经进入while循环?或者说,去旧学校吧。在while循环中放置一个cout来打印学生的名字。输入文件没有名称,没有学生和解析规则是错误的。 – user4581301

相关问题