mede by wit cym.
#include<bits/stdc++.h>
using namespace std;
struct Student{
string id;
string name;
int chinese;
int math;
int english;
int ele1;
int ele2;
int ele3;
char grade;
};
int sum1(Student student) {//语数英成绩
return student.chinese+student.math+student.english;
}
int sum2(Student student) {//总成绩
return sum1(student)+student.ele1+student.ele2+student.ele3;
}
bool compare(Student a, Student b){//自定义比较函数
if(sum2(a)>sum2(b)) return 1;
else if(sum2(a)<sum2(b)) return 0;
else{
if(a.grade<b.grade) return 1;
else if(a.grade>b.grade) return 0;
else{
if(sum1(a)>sum1(b)) return 1;
else return 0;
}
}
}
void readStudent(string filename, Student students[]){
FILE* file = fopen(filename.c_str(), "r");
if (!file) {
cout<<"文件打开失败\n";
system("pause");
system("exit");
}
while (fscanf(file, "%s %s %d %d %d %d %d %d %c",
&students[numStudents].id,
&students[numStudents].name,
&students[numStudents].chinese,
&students[numStudents].math,
&students[numStudents].english,
&students[numStudents].ele1,
&students[numStudents].ele2,
&students[numStudents].ele3,
&students[numStudents].grade) != EOF){
numStudents++;
}
fclose(file);
}
void outputRanking(Student students[]){
cout<<"新高考位次结果:\n";
for (int i=0; i<numStudents; i++) {
cout<<students[i].id<<' '
<<students[i].name<<' '
<<students[i].chinese<<' '
<<students[i].math<<' '
<<students[i].english<<' '
<<students[i].ele1<<' '
<<students[i].ele2<<' '
<<students[i].ele3<<' '
<<students[i].grade<<'\n';
}
}
const int MAX_STUDENTS = 100;//最大容量
int numStudents = 0;//学生个数
Student students[MAX_STUDENTS];
int main(){
readStudent("D:/student_data.txt", students);
sort(students, students+numStudents, compare);
outputRanking(students);
return 0;
}
下面更新一下用c++文件操作优化后的读入写出函数,应该没错滴
void readStudent(string filename, Student students[]){
ifstream fin(filename);
if (!fin.is_open()) {
cout<<"文件打开失败\n";
system("pause");
exit(0);
}
string buffer;
while(fin>>buffer){
string temp[9];
stringsplit(buffer, ' ', temp);
students[numStudents].id=temp[0];
students[numStudents].name=temp[1];
students[numStudents].chinese=int(temp[2].c_str());
students[numStudents].math=int(temp[3].c_str());
students[numStudents].english=int(temp[4].c_str());
students[numStudents].ele1=int(temp[5].c_str());
students[numStudents].ele2=int(temp[6].c_str());
students[numStudents].ele3=int(temp[7].c_str());
students[numStudents].grade=char(temp[8].c_str());
numStudents++;
}
fin.close();
}//下为分割string的函数
void stringsplit(const string str, char split, string arr[9]){
char* cstr = new char[str.size() + 1];
strcpy(cstr, str.c_str());//将str拷贝到char类型的strc
char* csplit = &split;
char* temp = strtok(cstr, csplit);
int cnt=0;
while (temp != NULL)
{
arr[cnt++]=string(temp);
temp = strtok(NULL, csplit);//下一个被分割的串
}
delete[] cstr;
}
void outputRanking(string filename, Student students[]){
ofstream fout(filename);
for (int i=0; i<numStudents; i++) {
fout<<students[i].id<<' '
<<students[i].name<<' '
<<students[i].chinese<<' '
<<students[i].math<<' '
<<students[i].english<<' '
<<students[i].ele1<<' '
<<students[i].ele2<<' '
<<students[i].ele3<<' '
<<students[i].grade<<'\n';
}
fout.close();
}