读入xml文本,按成绩大小由大到小排序输出成txt
xml文件格式如下所示
<grades>
<grade>
<id>2019001</id>
<name>张三</name>
<course>机器学习</course>
<score>85</score>
</grade>
<grade>
<id>2019002</id>
<name>李四</name>
<course>操作系统</course>
<score>90</score>
</grade>
<grade>
<id>2019003</id>
<name>王五</name>
<course>数据结构</course>
<score>95</score>
</grade>
</grades>
c++代码实现
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm> // 包含了 sort() 函数
using namespace std;
// 定义一个结构体 Grade,用于保存每个学生的成绩信息
struct Grade {
string id; // 学号
string name; // 姓名
string course; // 课程名
int score; // 分数
};
// 定义一个比较函数 cmp,用于将 Grade 结构体按照分数从大到小排序
bool cmp(const Grade& a, const Grade& b) {
return a.score > b.score;
}
int main() {
vector<Grade> grades; // 定义一个 vector,用于保存所有的学生成绩信息
ifstream fin("grades.xml"); // 打开 grades.xml 文件
string line;
while (getline(fin, line)) { // 逐行读取文件中的内容
if (line.find("<grade>") != string::npos) { // 如果当前行包含 "<grade>",说明这是一个学生的成绩信息
Grade grade;
getline(fin, line); // 读取下一行文本,即 <id> 标签中的内容
grade.id = line.substr(4, line.length() - 9); // 提取出学生的学号,注意去掉前面的 "<id>" 和后面的 "</id>"
getline(fin, line); // 读取下一行文本,即 <name> 标签中的内容
grade.name = line.substr(6, line.length() - 13); // 提取出学生的姓名,注意去掉前面的 "<name>" 和后面的 "</name>"
getline(fin, line); // 读取下一行文本,即 <course> 标签中的内容
grade.course = line.substr(8, line.length() - 17); // 提取出学生的课程名,注意去掉前面的 "<course>" 和后面的 "</course>"
getline(fin, line); // 读取下一行文本,即 <score> 标签中的内容
grade.score = stoi(line.substr(7, line.length() - 15)); // 提取出学生的分数,注意去掉前面的 "<score>" 和后面的 "</score>",并将字符串转换成整数
grades.push_back(grade); // 将该学生的成绩信息添加到 grades 中
}
}
fin.close(); // 关闭文件
sort(grades.begin(), grades.end(), cmp); // 使用 sort() 函数对 grades 中的元素按照分数从大到小排序
ofstream fout("grades.txt"); // 打开 grades.txt 文件
for (auto grade : grades) { // 遍历 grades 中的每一个元素
fout << grade.id << "," << grade.name << "," << grade.course << "," << grade.score << endl; // 将该学生的成绩信息输出到 grades.txt 文件中,用逗号隔开各个字段
}
fout.close(); // 关闭文件
return 0;
}
生成的txt文件如下所示
2018年反向操作(有编码问题,不太会)
#include<bits/stdc++.h>
using namespace std;
struct Grade
{
string id;
string name;
string course;
string score;
};
int main()
{
vector<Grade> grades;
ifstream fin("grades.txt");
string line;
while(getline(fin,line))
{
Grade g;
vector<int> x;
for(int i=0;i<line.size();i++)
{
if(line[i]==',')
x.push_back(i);
//cout<<line[i];
}
//cout<<endl;
//cout<<x.size()<<endl;
g.id=line.substr(0, x[0]);
g.name=line.substr(x[0]+1, x[1]);
//cout<<g.name<<endl;
g.course=line.substr(x[1]+1, x[2]);
//cout<<g.course<<endl;
g.score=line.substr(x[2]+1, line.length());
grades.push_back(g);
}
fin.close();
ofstream fout("newgrades.xml");
fout<<"<grades>"<<endl;
for(int i=0;i<3;i++)
{
fout<<"<grade>"<<endl;
fout<<"<id>"<<grades[i].id<<" </id>"<<endl;
fout<<"<name>"<<grades[i].name<<" </name>"<<endl;
fout<<"<course>"<<grades[i].course<<" </course>"<<endl;
fout<<"<score>"<<grades[i].score<<" </score>"<<endl;
fout<<"</grade>"<<endl;
}
fout<<"</grades>"<<endl;
fout.close();
//cout<<grades[0].id<<endl<<grades[0].name<<endl<<grades[0].course<<endl<<grades[0].score;
return 0;
}