从文本文件读入一个类中的对象 - 在另一个txt文件中写入
我已经更改了代码,现在程序正确读取了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);
}
错误的核心看起来是在这里:
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
无法验证代码的其余部分,因为似乎没有被
(OP已经解决了这个问题)size
--Crom的定义或仅分配知道这些循环是否覆盖了正确的基础 - 或者输入的有效性,因为没有提供的输入文件。如果解析规则错误,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;
}
}
一旦你知道文件失败的位置,你很有可能提出一个新的问题。这一个蔓延太多了。
谢谢,我试着将push_back移到while循环中,并不影响结果。它仍然只读取用户对result.txt的输入 –
由于大小由no。的用户输入的学生,我已经尝试使用newMyClass.size();以获得大小。 –
当你使用开发环境的调试器运行你的代码时,你是否曾经进入while循环?或者说,去旧学校吧。在while循环中放置一个cout来打印学生的名字。输入文件没有名称,没有学生和解析规则是错误的。 – user4581301
您切断了部分功能。最小值和最大值在哪里计算? students.txt与程序位于同一目录中吗? – Stephen
请提供更完整的代码(包括学生课程)和students.txt文件的示例。 – steiner
嗨,感谢您的回复,我添加了类定义和最小最大值计算。 –