Ziron 发表于 2022-7-7 22:38

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:36

本帖最后由 Smithliu 于 2022-7-7 23:38 编辑

Teac.Stu.Teacher_Student]并没有分配内存呀,不考虑内存泄漏的话可以这样写,Teac.Stu = new Student.Teacher_Student]

爱飞的猫 发表于 2022-7-8 07:29

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;
}

Ziron 发表于 2022-7-8 08:58

爱飞的猫 发表于 2022-7-8 07:29
struct 套 std::string 容易出毛病,帮你改用 std::vector 实现数组。

#include...

首先特别感谢大佬,vector 是个思路。跪拜!
有个问题
我程序放进去后,push_back 那块一直出bug,是什么情况

lossweight 发表于 2022-7-8 09:06

要恶补一下数组了 你这41行我看蒙了

sircadogan 发表于 2022-7-8 10:38

j和k同时增加有问题啊,那老师的数组可不就越界了吗

恨铁不成金 发表于 2022-7-8 17:43

随便改了一下,输出结果:
张老师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]
查看完整版本: C++ 从文件读到系统中,求助。