c++写入的txt文件乱码,怎么搞?
#include<iostream>
#include<string>
#include<fstream>
#include<algorithm>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<conio.h>
#include<vector>
using namespace std;
class Score {
public:
char num3[13];//学号
char num4[10];//课程号
char score[4];//成绩
};
class Student {
public:
char num[13];//学号
char banji[10];//班级
char name[24];//姓名
char sex[4];//性别
Score sc;
};
class Lesson {
public:
char num2[10];//课程号
char score[5];//学分
char name2[24];//课程名称
char time[5];//学时
int cla[50];
};
class Teacher {
public:
Lesson les;
int N = 50;
Student stu[];
void Scseek();//成绩查找
void Scmodify();//修改成绩信息
void score();//增加成绩信息
void Scdel();//删除成绩信息
void Scdisplay();//显示成绩信息
void Scempty();//清空所有成绩信息
void stuempty();//清空所有学生信息
void student();//增加学生个人信息
void studisplay();//显示学生个人信息
void stuseek();//查找学生信息
void stumodify();//修改学生信息
void studel();//删除学生信息
void lesson();//增加课程信息
void lesseek();//查找课程信息
void lesdisplay();//显示课程信息
void lesmodify();//修改课程信息
void lesdel();//修改课程信息
void lesempty();//清空课程信息
void menu1();//学生信息管理
void menu2();//课程信息菜单
void menu3();//成绩信息菜单
};
void Teacher::student() {
int n = 0;
int j = n;
int m;//要增加的学生人数}
cout << "请输入待增加的学生数:" << endl;
cin >> m;
do
{
Student stu;
cout << "请输入第" << j - n + 1 << "个学生的学号" << endl;//输入学生信息
cin >> stu.num;
cout << "请输入第" << j - n + 1 << "个学生的姓名" << endl;
cin >> stu.name;
cout << "请输入第" << j - n + 1 << "个学生的班级" << endl;
cin >> stu.banji;
cout << "请输入第" << j - n + 1 << "个学生的性别" << endl;
cin >> stu.sex;
j++;
fstream file("stuinfo.txt", ios::out | ios::binary | ios::app);
file.write((char*)&stu, sizeof(Student));//把该学生对象写入文件
file.close();
} while (j < n + m);
n += m;
cout << "信息增加完毕" << endl;
return;
}
void Teacher::lesson() {
int n = 0;
int j = n;
int m;//要增加的学生人数}
cout << "请输入待增加的课程数:" << endl;
cin >> m;
do
{
Lesson les;
cout << "请输入第" << j - n + 1 << "个课程的课程号" << endl;//输入学生信息
cin >> les.num2;
cout << "请输入第" << j - n + 1 << "个课程的名字" << endl;
cin >> les.name2;
cout << "请输入第" << j - n + 1 << "个课程的学分" << endl;
cin >> les.score;
cout << "请输入第" << j - n + 1 << "个课程的学时" << endl;
cin >> les.time;
j++;
fstream file("courseinfo.txt", ios::out | ios::binary | ios::app);
file.write((char*)&stu, sizeof(Lesson));//把该课程对象写入文件
file.close();
} while (j < n + m);
n += m;
cout << "信息增加完毕" << endl;
return;
}
void Teacher::score() {
int n = 0;
int j = n;
int m;//要增加的学生人数}
cout << "请输入待增加的成绩数量:" << endl;
cin >> m;
do
{
Score sco;
cout << "请输入第" << j - n + 1 << "个学生的学号" << endl;//输入学生信息
cin >> sco.num3;
cout << "请输入第" << j - n + 1 << "个课程的课程号(" << endl;
cin >> sco.num4;
cout << "请输入第" << j - n + 1 << "个课程的成绩" << endl;
cin >> sco.score;
j++;
fstream file("grade.txt", ios::out | ios::binary | ios::app);
file.write((char*)&sco, sizeof(Score));//把该学生对象写入文件
file.close();
} while (j < n + m);
n += m;
cout << "信息增加完毕" << endl;
return;
}
void Teacher::Scseek() {
char str[20];
char num[20];
cout << "请输入要查询的学生的学号" << endl;
cin >> str;
cout << "请输入要查询的对应课程号" << endl;
cin >> num;
fstream file("grade.txt", ios::binary | ios::in);//打开文件
while (!file.eof())
{
Score sco;
file.read((char*)&sco, sizeof(Score));
if (strcmp(sco.num3, str) == 0&& strcmp(sco.num4, str) == 0) //判断从文件读出对象的学号信息是否和输入相等
{
cout << "学生学号 课程号 成绩" << endl;
cout << sco.num3 << "\t" << sco.num4 << "\t" << sco.score<< endl;
break;
}
if (strcmp(sco.num3, str) != 0 && strcmp(sco.num4, str) != 0) {
cout << "该学号不存在" << endl;
}
}
file.close();
}
void Teacher::Scdisplay() {
int t = 0;
fstream file("grade.txt", ios::binary | ios::in);
cout << "学生学号 课程号 成绩" << endl;
while (!file.eof() && file.peek() != EOF)
{
Score sco;
file.read((char*)&sco, sizeof(Score));//从文件读出所有学生信息
cout << sco.num3 << "\t" << sco.num4 << "\t" << sco.score << endl;
};
file.close();
}
void Teacher::Scmodify() {
int item; //选择修改项,修改年龄
char score[5];
vector<Score> va;
Score sc;
int flag;
char str[20];
char num[20];
cout << "请输入要修改的学生的学号" << endl;
cin >> str;
cout << "请输入要修改的对应课程号" << endl;
cin >> num;
fstream file("grade.txt", ios::binary | ios::in);//打开文件存取成绩对象的文件
while (!file.eof())
{
file.read((char*)&sc, sizeof(Score));//读取文件
if (strcmp(sc.num3, str) == 0 && strcmp(sc.num4, num) == 0)//如果存在学生信息输出
{
flag = 1;
cout << "学生学号 课程号 成绩" << endl;
cout << sc.num3 << "\t" << sc.num4 << "\t" << sc.score << endl;
break;
}
else {
flag = 0;
cout << "无对应信息" << endl;
}
}
file.close();
while (flag == 1)
{
while (!file.eof() && file.peek() != EOF)
{
file.read((char*)&sc, sizeof(Score));//读取文件
if (strcmp(sc.num3, str) == 0 && strcmp(sc.num4, num) == 0)
{
continue;
}
else {
file.close();
break;
}
va.push_back(sc);//将非删除的学生存入容器
}
fstream file1("grade.txt", ios::out | ios::trunc);
for (int i = 0; i < va.size(); i++)
{
file1.write((char*)&va[i], sizeof(Score));//将容器中的学生对象写入文件
}
printf("------------------\n");
printf("1.修改学号\n");
printf("2.修改课程号\n");
printf("3.修改成绩\n");
printf("4.退出本菜单\n");
printf("------------------\n");
printf("请选择子菜单编号:");
scanf_s("%d", &item);
switch (item)
{
case 1:
printf("请输入新的学号:\n");
cin >> str;
strcpy_s(sc.num3,str); break;
case 2:
printf("请输入新的课程号:\n");
cin >> num;
strcpy_s(sc.num4, num); break;
case 3:
printf("请输入新的成绩:\n");
cin >> score;
strcpy_s(sc.score,score); break;
case 4: {
fstream file("grade.txt", ios::out | ios::binary | ios::app);
cout << "修改成功" << endl;
file.write((char*)&sc, sizeof(Score));//把新的学生信息写入文件
file.close();
return;
}
default:printf("请在1-4之间选择\n");
}
}
}
void Teacher::Scdel() {
vector<Score> va;
Score sco;//将读出的学生信息存入该对象
int flag;
char str[20];
char num[20];
cout << "请输入要删除的学生的学号" << endl;
cin >> str;
cout << "请输入要查询的对应课程号" << endl;
cin >> num;
fstream file("grade.txt", ios::binary | ios::in);//打开文件存取学生对象的文件
while (!file.eof() && file.peek() != EOF)
{
file.read((char*)&sco, sizeof(Score));//读取文件
if (strcmp(sco.num3, str) == 0 && strcmp(sco.num4, str) == 0)//如果存在学生信息输出
{
flag = 1;
continue;
}
va.push_back(sco);//将非删除的学生存入容器
}
fstream file1("grade.txt", ios::out | ios::trunc);
for (int i = 0; i < va.size(); i++)
{
file1.write((char*)&va[i], sizeof(Score));//将容器中的学生对象写入文件
}
cout << "删除成功" << endl;
file.close();//关闭文件
file1.close();
}
void Teacher::Scempty() {
fstream file("grade.txtt", ios::out);
};
void Teacher::studisplay() {
int t = 0;
fstream file("stuinfo.txt", ios::binary | ios::in);
cout << "学生学号 班级 学生姓名 性别" << endl;
while (!file.eof() && file.peek() != EOF)
{
Student stu;
file.read((char*)&stu, sizeof(Student));//从文件读出所有学生信息
cout << stu.num << "\t" << stu.banji << "\t" << stu.name << "\t " << stu.sex << endl;
};
file.close();
}
void Teacher::stumodify() {
int item; //选择修改项,修改年龄
float score;
vector<Student> va;
Student stu;
int flag;
char str[20];//暂时存修改内容6
cout << "请输入要修改的学生的学号" << endl;
cin >> str;
fstream file("stuinfo.txt", ios::binary | ios::in);//打开文件存取学生对象的文件
while (!file.eof() && file.peek() != EOF)
{
file.read((char*)&stu, sizeof(Student));//读取文件
if (strcmp(stu.num, str) == 0)//如果存在学生信息输出
{
flag = 1;
continue;
}
else {
flag = 0;
cout << "该学生不存在" << endl;
break;
}
va.push_back(stu);//将非删除的学生存入容器
}
fstream file1("stuinfo.txt", ios::out | ios::trunc);
for (int i = 0; i < va.size(); i++)
{
file1.write((char*)&va[i], sizeof(Student));//将容器中的学生对象写入文件
}
while (!file.eof())
{
file.read((char*)&stu, sizeof(Student));//读取文件
if (strcmp(stu.num, str) == 0)//如果存在学生信息输出
{
flag = 1;
cout << "学生学号 班级 学生姓名 性别" << endl;
cout << stu.num << "\t" << stu.banji << "\t" << stu.name << "\t " << stu.sex << endl;
break;
}
else {
flag = 0;
}
}
file.close();
while (flag==1)
{
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改班级\n");
printf("3.修改性别\n");
printf("4.退出本菜单\n");
printf("------------------\n");
printf("请选择子菜单编号:");
scanf_s("%d", &item);
switch (item)
{
case 1:
printf("请输入新的姓名:\n");
cin >> str;
strcpy_s(stu.name, str); break;//为学生姓名赋新值
case 2:
printf("请输入新的班级:\n");
cin >> str;
strcpy_s(stu.banji, str); break;//为学生班级赋新值
case 3:
printf("请输入新的性别:\n");
cin >> str;
strcpy_s(stu.sex, str); break;//为学生性别赋新值
case 4: {
fstream file("stuinfo.txt", ios::out | ios::binary | ios::app);
cout << "修改成功" << endl;
file.write((char*)&stu, sizeof(Student));//把新的学生信息写入文件
file.close();
return;
}
default:printf("请在1-4之间选择\n");
}
}
}
void Teacher::studel() {
vector<Student> va;
Student stu;//将读出的学生信息存入该对象
int flag;
char str[20];
cout << "请输入要删除的学生的学号" << endl;
cin >> str;
fstream file("stuinfo.txt", ios::binary | ios::in);//打开文件存取学生对象的文件
while (!file.eof() && file.peek() != EOF)
{
file.read((char*)&stu, sizeof(Student));//读取文件
if (strcmp(stu.num, str) == 0)//如果存在学生信息输出
{
flag = 1;
continue;
}
va.push_back(stu);//将非删除的学生存入容器
}
fstream file1("stuinfo.txt", ios::out | ios::trunc);
for (int i = 0; i < va.size(); i++)
{
file1.write((char*)&va[i], sizeof(Student));//将容器中的学生对象写入文件
}
cout << "删除成功" << endl;
file.close();//关闭文件
file1.close();
}
void Teacher::stuempty()
{
fstream file("stuinfo.txt", ios::out);
}
void Teacher::stuseek() {
char str[20];
cout << "请输入要查询的学生的学号" << endl;
cin >> str;
fstream file("stuinfo.txt", ios::binary | ios::in);//打开文件
while (!file.eof())
{
Student stu;
file.read((char*)&stu, sizeof(Student));
if (strcmp(stu.num, str) == 0) //判断从文件读出对象的学号信息是否和输入相等
{
cout << "学生学号 班级 学生姓名 性别" << endl;
cout << stu.num << "\t" << stu.banji << "\t" << stu.name << "\t " << stu.sex << endl;
break;
}
if (strcmp(stu.num, str) != 0) {
cout << "该学号不存在" << endl;
}
}
file.close();
}
void Teacher::lesseek() {
char str[20];
cout << "请输入要查询的课程的课程号" << endl;
cin >> str;
fstream file("courseinfo.txt", ios::binary | ios::in);//打开文件
while (!file.eof())
{
Student stu;
file.read((char*)&stu, sizeof(Student));
if (strcmp(stu.num, str) == 0) //判断从文件读出对象的学号信息是否和输入相等
{
cout << "课程号 学分 课程名称 学时" << endl;
cout << les.num2 << "\t" << les.score << "\t" << les.name2 << "\t " <<les.time << endl;
break;
}
if (strcmp(les.num2, str) != 0) {
cout << "该课程号不存在" << endl;
}
}
file.close();
}
void Teacher::lesdisplay() {
int t = 0;
fstream file("courseinfo.txt", ios::binary | ios::in);
cout << "课程号 学分 课程名称 学时" << endl;
while (!file.eof() && file.peek() != EOF)
{
Lesson les;
file.read((char*)&les, sizeof(Lesson));//从文件读出所有学生信息
cout << les.num2 << "\t" << les.score << "\t" << les.name2 << "\t " << les.time << endl;
};
file.close();
}
void Teacher::lesmodify() {
int item; //选择修改项,修改年龄
float score;
vector<Lesson> va;
Lesson les;
int flag;
char str[20];//暂时存修改内容6
cout << "请输入要修改的学生的学号" << endl;
cin >> str;
fstream file("courseinfo.txt", ios::binary | ios::in);//打开文件存取学生对象的文件
while (!file.eof() && file.peek() != EOF)
{
file.read((char*)&les, sizeof(Lesson));//读取文件
if (strcmp(les.num2, str) == 0)//如果存在学生信息输出
{
flag = 1;
continue;
}
else {
flag = 0;
cout << "该课程不存在" << endl;
break;
}
va.push_back(les);//将非删除的学生存入容器
}
fstream file1("courseinfo.txt", ios::out | ios::trunc);
for (int i = 0; i < va.size(); i++)
{
file1.write((char*)&va[i], sizeof(Student));//将容器中的学生对象写入文件
}
while (!file.eof())
{
file.read((char*)&les, sizeof(Student));//读取文件
if (strcmp(les.num2, str) == 0)//如果存在学生信息输出
{
flag = 1;
cout << "课程号 学分 课程名称 学时" << endl;
cout << les.num2 << "\t" << les.score << "\t" << les.name2 << "\t " << les.time << endl;
break;
}
else {
flag = 0;
}
}
file.close();
while (flag == 1)
{
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改班级\n");
printf("3.修改性别\n");
printf("4.退出本菜单\n");
printf("------------------\n");
printf("请选择子菜单编号:");
scanf_s("%d", &item);
switch (item)
{
case 1:
printf("请输入新的课程号:\n");
cin >> str;
strcpy_s(les.num2, str); break;//为学生姓名赋新值
case 2:
printf("请输入新的学分:\n");
cin >> str;
strcpy_s(les.score, str); break;//为学生班级赋新值
case 3:
printf("请输入新的课程名称:\n");
cin >> str;
strcpy_s(les.name2, str); break;//为学生性别赋新值
case 4: {
fstream file("courseinfo.txt", ios::out | ios::binary | ios::app);
cout << "修改成功" << endl;
file.write((char*)&les, sizeof(Lesson));//把新的学生信息写入文件
file.close();
return;
}
default:printf("请在1-4之间选择\n");
}
}
}
void Teacher::lesdel() {
vector<Lesson> va;
Lesson les;//将读出的学生信息存入该对象
int flag;
char str[20];
cout << "请输入要删除的学生的学号" << endl;
cin >> str;
fstream file("courseinfo.txt", ios::binary | ios::in);//打开文件存取学生对象的文件
while (!file.eof() && file.peek() != EOF)
{
file.read((char*)&les, sizeof(Lesson));//读取文件
if (strcmp(les.num2, str) == 0)//如果存在学生信息输出
{
flag = 1;
continue;
}
va.push_back(les);//将非删除的学生存入容器
}
fstream file1("courseinfo.txt", ios::out | ios::trunc);
for (int i = 0; i < va.size(); i++)
{
file1.write((char*)&va[i], sizeof(Lesson));//将容器中的学生对象写入文件
}
cout << "删除成功" << endl;
file.close();//关闭文件
file1.close();
}
void Teacher::lesempty() {
fstream file("courseinfo.txt", ios::out);
};
void Teacher::menu1() {
Teacher people;
int number1;
do {
printf("------------------\n");
printf("-----<<学生信息管理>>-------\n");
printf("1.增加学生信息\n");
printf("2.查找学生信息\n");
printf("3.学生信息汇总\n");
printf("4.修改学生信息\n");
printf("5.删除学生信息\n");
printf("6.清空学生信息\n");
printf("7.退出子程序\n");
printf("------------------\n");
cin >> number1;
switch (number1) {
case 1:
people.student();
break;
case 2:
people.stuseek();
break;
case 3:
people.studisplay();
break;
case 4:
people.stumodify();
break;
case 5:
people.studel();
break;
case 6:
people.stuempty();
break;
case 7:
break;
default:
printf("请在1-7之间选择\n");
break;
}
} while (number1!= 7);
}
void Teacher::menu2() {
int number2;
Teacher people;
do {
printf("------------------\n");
printf("-----<<课程信息管理>>-------\n");
printf("1.增加课程信息\n");
printf("2.查找课程信息\n");
printf("3.课程信息汇总\n");
printf("4.修改课程信息\n");
printf("5.删除课程信息\n");
printf("6.清空课程信息\n");
printf("7.退出子程序\n");
printf("------------------\n");
cin >> number2;
switch (number2) {
case 1:
people.lesson();
break;
case 2:
people.lesseek();
break;
case 3:
people.lesdisplay();
break;
case 4:
people.lesmodify();
break;
case 5:
people.lesdel();
break;
case 6:
people.lesempty();
break;
case 7:
break;
default:
printf("请在1-7之间选择\n");
break;
}
} while (number2 != 7);
}
void Teacher::menu3() {
int number3;
Teacher people;
do {
printf("------------------\n");
printf("-----<<成绩信息管理>>-------\n");
printf("1.增加成绩信息\n");
printf("2.查找成绩信息\n");
printf("3.课程成绩汇总\n");
printf("4.修改成绩信息\n");
printf("5.删除成绩信息\n");
printf("6.清空成绩信息\n");
printf("7.退出子程序\n");
printf("------------------\n");
cin >> number3;
switch (number3) {
case 1:
people.score();
break;
case 2:
people.Scseek();
break;
case 3:
people.Scdisplay();
break;
case 4:
people.Scmodify();
break;
case 5:
people.Scdel();
break;
case 6:
people.Scempty();
break;
case 7:
break;
default:
printf("请在1-7之间选择\n");
break;
}
} while (number3 != 7);
}
int main() {
Teacher people;
int number;
do {
cout << "学生信息管理系统" << endl;
printf("------------------\n");
printf("1.学生信息菜单\n");
printf("2.课程信息菜单\n");
printf("3.成绩信息菜单\n");
printf("4.退出程序\n");
printf("------------------\n");
cin >> number;
switch (number) {
case 1:
people.menu1();
break;
case 2:
people.menu2();
break;
case 3:
people.menu3();
break;
case 4:
break;
default:
printf("请在1-4之间选择\n");
break;
}
} while (number != 4);
return 0;
}