简体   繁体   English

从文本文件读取到类中的对象向量 - 在另一个 txt 文件中写入

[英]Reading from a text file into a vector of objects in a class- writing in another txt file

I have changed the code, now the program reads teh file form students.txt correctly, but still calculated from user input instead of students.txt我已经更改了代码,现在程序正确读取了来自 student.txt 的文件,但仍然根据用户输入而不是 student.txt 计算
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include

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); 
}

Core of bug looks to be right here:错误的核心看起来就在这里:

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); 

Once the indentation is fixed, it's easy to see that newStudent is only pushed into the vector after the file has been completely read.一旦缩进被修复,很容易看到newStudent只有在文件被完全读取才会被推入向量中。 OP should be getting the last student into the vector, but none of the others. OP 应该让最后一个学生进入向量,但其他人都没有。 Since OP probably wants all of the students in the file in the vector,由于 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

Can't verify the rest of the code because there doesn't seem to be a definition or assignment of size --Crom only knows if those for loops are covering the correct ground--or the validity of the input because there is no provided input file. 无法验证代码的其余部分,因为似乎没有 size的定义或分配——Crom 只知道那些 for 循环是否覆盖了正确的基础——或者输入的有效性,因为没有提供输入文件。 OP may be reading exactly nothing if the parsing rules are wrong. 如果解析规则错误,OP 可能什么也读不出来。 Debugger would figure that out much faster than another Stack Overflow post. 调试器会比另一个 Stack Overflow 帖子更快地解决这个问题。 (OP has since addressed this) (OP 已经解决了这个问题)

New stuff.新的东西。

I don't see why the input doesn't parse either.我不明白为什么输入也没有解析。 First make sure the file is encoded as ASCII text.首先确保文件被编码为 ASCII 文本。 I do not know what tools you have to do this on your computer.我不知道你有什么工具可以在你的电脑上做到这一点。 I use a hex editor, lets you see the file in byte values rather than characters, to see if the characters are not matching their expected ASCII values.我使用十六进制编辑器,让您以字节值而不是字符的形式查看文件,以查看字符是否与其预期的 ASCII 值不匹配。 A text editor may be converting for you and hiding the differences.文本编辑器可能会为您转换并隐藏差异。

For example, often a UTF-8 encoded file will look exactly the same as an ASCII file except for a bit of binary at the beginning marking informing the reader program that it is a UTF-8 file and may contain non-ASCII.例如,通常 UTF-8 编码的文件看起来与 ASCII 文件完全相同,只是在开头标记了一点二进制文件,通知阅读器程序它是一个 UTF-8 文件并且可能包含非 ASCII。

If it isn't, there's the problem.如果不是,那就是问题所在。 Re-save the file as an ASCII file.将该文件重新保存为 ASCII 文件。 If it is an ASCII file, time to minimize.如果是 ASCII 文件,时间最小化。 Write a small program that does nothing but open the file, read it token by token, and see which token fails to parse.编写一个小程序,只打开文件,逐个令牌读取它,然后查看哪个令牌解析失败。 Something like this:像这样的东西:

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;
    }
}

Once you know where the file fails, you are in great position to ask a new question.一旦您知道文件在哪里失败,您就可以提出一个新问题。 This one is sprawling a bit too much.这个有点过于庞大了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM