C++ 从文件读到系统中,求助。
本帖最后由 Ziron 于 2022-7-7 22:55 编辑情景:有三个老师,每个老师有不同数量的学生。目的:从包含这些老师和学生信息的txt文档中将信息组合提取出来。 就是能输出老师.学生.名字。
问题:我写的代码老是出错,要不是读不出来,要不就是堆栈溢出。求大神帮忙。
代码应该是在 41行出错 ,但是不知道怎么修改,请大神帮忙下。
-------------------------
老师名字 年龄 学生数量
学生名字 学生性别
--------------txt文档------
张老师 30 3
李老师 34 4
王老师 25 5
学生A 男
学生B 男
学生C 女
学生BA 男
学生BB 男
学生BC 男
学生BD 女
学生CA 男
学生CB 女
学生CC 男
学生CD 女
学生CE 男
------------------------------
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
struct Student//学生
{
string Student_Name;//名字
string Student_Sex;//性别
};
struct Teacher//老师
{
string Teacher_Name;//名字
int Teacher_Age = 0;//年龄
int Teacher_Student = 0;//学生数量
Student* Stu;//学生结构体对象
};
void Read_File(Teacher* Teac)//读文件
{
ifstream ifs;
ifs.open("test.txt", ios::in);//读文件
if (!ifs.is_open())
{
cout << "打开文件失败!" << endl;
return;
}
string buf;
int times = 0;
int i = 0;
int j = 0;
int k = 0;
cout << "1" << endl;
while (getline(ifs, buf))
{
istringstream temp(buf);
if (times < 3)//读前三行
{
temp >> Teac.Teacher_Name >> Teac.Teacher_Age >> Teac.Teacher_Student;
Teac.Stu.Teacher_Student];
i++;
}
if (times >= 3)//读后面几行
{
temp >> Teac.Stu.Student_Name >> Teac.Stu.Student_Sex;
j++;
k++;
}
times++;
}
ifs.close();
}
int main()
{
Teacher Teac;//创建老师对象
Read_File(Teac);//读文件
for (int i = 0; i < 3; i++)//输出
{
cout << Teac.Teacher_Name << "" << Teac.Teacher_Age << "" << Teac.Teacher_Student << endl;
for (int j = 0; j < Teac.Teacher_Student; j++)
cout << Teac.Stu.Student_Name << "" << Teac.Stu->Student_Sex << endl;
}
system("pause");
return 0;
}
本帖最后由 Smithliu 于 2022-7-7 23:38 编辑
Teac.Stu.Teacher_Student]并没有分配内存呀,不考虑内存泄漏的话可以这样写,Teac.Stu = new Student.Teacher_Student] struct 套 std::string 容易出毛病,帮你改用 std::vector 实现数组。
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
struct Student //学生
{
string Student_Name; //名字
string Student_Sex;//性别
};
struct Teacher //老师
{
string Teacher_Name; //名字
int Teacher_Age = 0; //年龄
int Teacher_Student = 0; //学生数量
vector<Student *> Stu; //学生结构体对象
};
void Read_File(Teacher *Teac) //读文件
{
ifstream ifs;
ifs.open("test.txt", ios::in); //读文件
if (!ifs.is_open()) {
cout << "打开文件失败!" << endl;
return;
}
string buf;
int times = 0;
int i = 0;
int j = 0;
int k = 0;
while (getline(ifs, buf)) {
istringstream temp(buf);
if (times < 3) //读前三行
{
temp >> Teac.Teacher_Name >> Teac.Teacher_Age >>
Teac.Teacher_Student;
i++;
}
if (times >= 3) //读后面几行
{
if (k == Teac.Teacher_Student) {
k = 0;
j++;
}
string name, sex;
temp >> name >> sex;
Teac.Stu.push_back(new Student{
Student_Name : name,
Student_Sex : sex,
});
k++;
}
times++;
}
ifs.close();
}
int main() {
Teacher Teac; //创建老师对象
Read_File(Teac); //读文件
for (int i = 0; i < 3; i++) //输出
{
cout << Teac.Teacher_Name << "" << Teac.Teacher_Age << ""
<< Teac.Teacher_Student << endl;
for (int j = 0; j < Teac.Teacher_Student; j++) {
cout << Teac.Stu->Student_Name << ""
<< Teac.Stu->Student_Sex << endl;
}
}
system("pause");
return 0;
} 爱飞的猫 发表于 2022-7-8 07:29
struct 套 std::string 容易出毛病,帮你改用 std::vector 实现数组。
#include...
首先特别感谢大佬,vector 是个思路。跪拜!
有个问题
我程序放进去后,push_back 那块一直出bug,是什么情况
要恶补一下数组了 你这41行我看蒙了 j和k同时增加有问题啊,那老师的数组可不就越界了吗 随便改了一下,输出结果:
张老师303
学生B男
学生C男
学生BA男
李老师344
学生BB男
学生BC男
学生BD男
学生CA男
王老师255
学生CB女
学生CC女
学生CD女
学生CE女
学生CE女
请按任意键继续. . .
修改后的代码
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
struct Student//学生
{
string Student_Name;//名字
string Student_Sex;//性别
};
struct Teacher//老师
{
string Teacher_Name;//名字
int Teacher_Age = 0;//年龄
int Teacher_Student = 0;//学生数量
Student Stu;//学生结构体对象, 这儿给你改为了数组,原先的指针需要动态申请内存
};
void Read_File(Teacher* Teac)//读文件
{
ifstream ifs;
ifs.open("test.txt", ios::in);//读文件
if (!ifs.is_open())
{
cout << "打开文件失败!" << endl;
return;
}
string buf;
int times = 0;
int i = 0;
while (getline(ifs, buf))
{
istringstream temp(buf);
if (times < 3)//读前三行,读取老师的信息,老师有几个学生
{
temp >> Teac.Teacher_Name >> Teac.Teacher_Age >> Teac.Teacher_Student;
i++;
}
if (times >= 3)//读后面几行
{
for (int j=0; j<3; j++)// 一共有三位老师
{
for (int k=0; k<Teac.Teacher_Student; k++) // 每位老师有Teacher_Student位学生
{
getline(ifs, buf);
istringstream temp2(buf);
temp2>> Teac.Stu.Student_Name >> Teac.Stu.Student_Sex;
}
}
}
times++;
}
ifs.close();
}
int main()
{
Teacher Teac;//创建老师对象
Read_File(Teac);//读文件
for (int i = 0; i < 3; i++)//输出
{
cout << Teac.Teacher_Name << "" << Teac.Teacher_Age << "" << Teac.Teacher_Student << endl;
for (int j = 0; j < Teac.Teacher_Student; j++)
cout << Teac.Stu.Student_Name << "" << Teac.Stu->Student_Sex << endl;
}
system("pause");
return 0;
}
页:
[1]