吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 997|回复: 6
收起左侧

[求助] C++ 从文件读到系统中,求助。

[复制链接]
Ziron 发表于 2022-7-7 22:38
本帖最后由 Ziron 于 2022-7-7 22:55 编辑

情景:有三个老师,每个老师有不同数量的学生。  目的:从包含这些老师和学生信息的txt文档中将信息组合提取出来。 就是能输出  老师[1].学生[1].名字。
    问题:我写的代码老是出错,要不是读不出来,要不就是堆栈溢出。求大神帮忙。
代码应该是在   41行出错 ,但是不知道怎么修改,请大神帮忙下。

-------------------------
老师名字      年龄    学生数量
学生名字      学生性别
--------------txt文档------
张老师        30        3
李老师        34        4
王老师        25        5
学生A        男
学生B        男
学生C        女
学生BA        男
学生BB        男
学生BC        男
学生BD        女
学生CA        男
学生CB        女
学生CC        男
学生CD        女
学生CE        男
------------------------------



[C++] 纯文本查看 复制代码
#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[i].Teacher_Name >> Teac[i].Teacher_Age >> Teac[i].Teacher_Student;                
                        Teac[i].Stu[Teac[i].Teacher_Student];
                        i++;
                }
                
                if (times >= 3)//读后面几行
                {
                        temp >> Teac[j].Stu[k].Student_Name >> Teac[j].Stu[k].Student_Sex;
                        j++;
                        k++;
                }
                times++;
        }
        ifs.close();

}

int main()
{
        Teacher Teac[3];//创建老师对象
        Read_File(Teac);//读文件

        for (int i = 0; i < 3; i++)//输出
        {
                cout << Teac[i].Teacher_Name << "  " << Teac[i].Teacher_Age << "  " << Teac[i].Teacher_Student << endl;
                for (int j = 0; j < Teac[i].Teacher_Student; j++)
                        cout << Teac[i].Stu[j].Student_Name << "  " << Teac[i].Stu->Student_Sex << endl;
        }
        system("pause");
        return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

Teac.Stu[Teac.Teacher_Student]并没有分配内存呀,不考虑内存泄漏的话可以这样写,Teac.Stu = new Student[Teac.Teacher_Student]
爱飞的猫 发表于 2022-7-8 07:29
struct 套 std::string 容易出毛病,帮你改用 std::vector 实现数组。

[C++] 纯文本查看 复制代码
#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[i].Teacher_Name >> Teac[i].Teacher_Age >>
          Teac[i].Teacher_Student;
      i++;
    }

    if (times >= 3) //读后面几行
    {
      if (k == Teac[j].Teacher_Student) {
        k = 0;
        j++;
      }

      string name, sex;
      temp >> name >> sex;
      Teac[j].Stu.push_back(new Student{
        Student_Name : name,
        Student_Sex : sex,
      });

      k++;
    }
    times++;
  }
  ifs.close();
}

int main() {
  Teacher Teac[3]; //创建老师对象
  Read_File(Teac); //读文件

  for (int i = 0; i < 3; i++) //输出
  {
    cout << Teac[i].Teacher_Name << "  " << Teac[i].Teacher_Age << "  "
         << Teac[i].Teacher_Student << endl;
    for (int j = 0; j < Teac[i].Teacher_Student; j++) {
      cout << Teac[i].Stu[j]->Student_Name << "  "
           << Teac[i].Stu[j]->Student_Sex << endl;
    }
  }
  system("pause");
  return 0;
}
 楼主| Ziron 发表于 2022-7-8 08:58
爱飞的猫 发表于 2022-7-8 07:29
struct 套 std::string 容易出毛病,帮你改用 std::vector 实现数组。

[mw_shl_code=cpp,true]#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
随便改了一下,输出结果:
[C++] 纯文本查看 复制代码
张老师  30  3
学生B  男
学生C  男
学生BA  男
李老师  34  4
学生BB  男
学生BC  男
学生BD  男
学生CA  男
王老师  25  5
学生CB  女
学生CC  女
学生CD  女
学生CE  女
学生CE  女
请按任意键继续. . .


修改后的代码
[C++] 纯文本查看 复制代码
#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[12];//学生结构体对象, 这儿给你改为了数组,原先的指针需要动态申请内存
};

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[i].Teacher_Name >> Teac[i].Teacher_Age >> Teac[i].Teacher_Student;
			i++;
		}

		if (times >= 3)//读后面几行
		{
			for (int j=0; j<3; j++)// 一共有三位老师
			{
				for (int k=0; k<Teac[j].Teacher_Student; k++) // 每位老师有Teacher_Student位学生
				{
					getline(ifs, buf);
					istringstream temp2(buf);
					temp2>> Teac[j].Stu[k].Student_Name >> Teac[j].Stu[k].Student_Sex;
				}
			}
		}
		times++;
	}
	ifs.close();

}

int main()
{
	Teacher Teac[3];//创建老师对象
	Read_File(Teac);//读文件

	for (int i = 0; i < 3; i++)//输出
	{
		cout << Teac[i].Teacher_Name << "  " << Teac[i].Teacher_Age << "  " << Teac[i].Teacher_Student << endl;
		for (int j = 0; j < Teac[i].Teacher_Student; j++)
			cout << Teac[i].Stu[j].Student_Name << "  " << Teac[i].Stu->Student_Sex << endl;
	}
	system("pause");
	return 0;
}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表