关于C++读取文件的一个问题

沉默的牧羊者 2016-01-08 08:29:18

我用2013进行编译时,发现读取文件时会出现这个问题,这个问题是出现在有读取文件的函数板块的最后,将要退出函数时出现的。
...全文
165 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-01-11
  • 打赏
  • 举报
回复
void ReadItem(T_Student t_std) 是否应该为 void ReadItem(T_Student & t_std)
沉默的牧羊者 2016-01-11
  • 打赏
  • 举报
回复
引用 11 楼 paschen 的回复:
是是,一般有指针的都不是直接保存与读出,因为你保存指针没意思,类中如果有指针同样是这样 你应该把指针指向的内容保存了,然后读出时在分配空间存储或者构造对象
你好,不好意思又打扰了,现在又遇到一个问题,关于无法读取二进制文件的问题

void ReadData()
{
	Student *p = NULL, *q = NULL;
	T_Student t_std;
	m_length = 0;
	fstream fdata;
	fdata.open("E:\\StudentSystemData.orz", ios::in | ios::binary);
	int stdnumber = 0;
	if (!fdata)
	{
		cerr << "File would be open" << endl;
		return;
	}
	fdata.seekg(0, ios::beg);
	fdata.read((char*)&stdnumber, sizeof(int));
	m_length = 4;
	for (int i = 0; i < stdnumber; i++)
	{
		ReadItem(t_std);
		if (head == NULL)
		{
			head = new Student;
			head->SetData(t_std);
			phead = head;
			q = head;
		}
		else
		{
			p = new Student;
			p->SetData(t_std);
			q->next = p;
			p = p->next;
		}
	}
}



void ReadItem(T_Student t_std)
{
	fstream fdata;
	fdata.open("E:\\StudentSystemData.orz", ios::in | ios::binary);
	ReadString(t_std.t_name);
	ReadString(t_std.t_id);
	ReadString(t_std.t_sex);
	fdata.seekp(m_length, ios::beg);
	fdata.read((char*)&t_std.t_phy, sizeof(int));
	fdata.read((char*)&t_std.t_eng, sizeof(int));
	fdata.read((char*)&t_std.t_math, sizeof(int));
	fdata.read((char*)&t_std.t_cs, sizeof(int));
	fdata.read((char*)&t_std.t_cproject, sizeof(int));
	m_length += 20;
	fdata.close();
}




void ReadString(string &str)
{
	fstream fdata;
	int length = 0;
	char *s;
	fdata.open("E:\\StudentSystemData.orz", ios::in | ios::binary);
	fdata.seekp(m_length, ios::beg);
	fdata.read((char*)&length, sizeof(int));
	m_length += length + 4;
	s = new char[length];
	fdata.read(s, length);
	str = s;
	delete[]s;
}

我是用m_length来记录指针移动的距离的,写入的时候单步调试时看了没问题,字节数也正确,但是读取时只能够读取最开始的stdnumber学生人数,谢谢你的帮助
paschen 版主 2016-01-10
  • 打赏
  • 举报
回复
是是,一般有指针的都不是直接保存与读出,因为你保存指针没意思,类中如果有指针同样是这样 你应该把指针指向的内容保存了,然后读出时在分配空间存储或者构造对象
沉默的牧羊者 2016-01-10
  • 打赏
  • 举报
回复
引用 9 楼 paschen 的回复:
[quote=引用 8 楼 Zelea 的回复:] [quote=引用 7 楼 paschen 的回复:] [quote=引用 5 楼 Zelea 的回复:] 我一步步的return, 发现是在read过后立刻出错了,为什么??不解!!
检查函数是否执行成功,检查指针是否有效[/quote] 我想知道为什么read过后会出错??一般是什么原因导致read过后在return会出错??[/quote] 不知道,从你代码看不出,需要自己分析!你想知道你观察分析啊[/quote] 我的问题类似于http://bbs.csdn.net/topics/390690143?page=1所说的,我也理解了String不能随便写入文件中,这个问题困扰我了好几天,谢谢你的耐心解答
沉默的牧羊者 2016-01-09
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
[quote=引用 5 楼 Zelea 的回复:] 我一步步的return, 发现是在read过后立刻出错了,为什么??不解!!
检查函数是否执行成功,检查指针是否有效[/quote] 我想知道为什么read过后会出错??一般是什么原因导致read过后在return会出错??
paschen 版主 2016-01-09
  • 打赏
  • 举报
回复
引用 8 楼 Zelea 的回复:
[quote=引用 7 楼 paschen 的回复:] [quote=引用 5 楼 Zelea 的回复:] 我一步步的return, 发现是在read过后立刻出错了,为什么??不解!!
检查函数是否执行成功,检查指针是否有效[/quote] 我想知道为什么read过后会出错??一般是什么原因导致read过后在return会出错??[/quote] 不知道,从你代码看不出,需要自己分析!你想知道你观察分析啊
paschen 版主 2016-01-08
  • 打赏
  • 举报
回复
引用 5 楼 Zelea 的回复:
我一步步的return, 发现是在read过后立刻出错了,为什么??不解!!
检查函数是否执行成功,检查指针是否有效
沉默的牧羊者 2016-01-08
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
[quote=引用 3 楼 Zelea 的回复:] [quote=引用 1 楼 paschen 的回复:] 点中断,然后通过变量窗口、调用堆栈观察分析原因,特别注意指针是否有效
还有,我想问一下这是一个什么问题,为什么会出现这种状况??谢谢帮助[/quote] 因为你程序哪里写错了,比如 int* a = NULL; *a=5; 这种语句就会引起异常 你可以从变量窗口获得变量的值,调用堆栈定位到相关代码,然后分析什么原因导致的 必要时单步运行调试程序,分析原因 我一步步的return, 发现是在read过后立刻出错了,为什么??不解!!
沉默的牧羊者 2016-01-08
  • 打赏
  • 举报
回复


我一步步的return, 发现是在read过后立刻出错了,为什么??不解!!
paschen 版主 2016-01-08
  • 打赏
  • 举报
回复
引用 3 楼 Zelea 的回复:
[quote=引用 1 楼 paschen 的回复:] 点中断,然后通过变量窗口、调用堆栈观察分析原因,特别注意指针是否有效
还有,我想问一下这是一个什么问题,为什么会出现这种状况??谢谢帮助[/quote] 因为你程序哪里写错了,比如 int* a = NULL; *a=5; 这种语句就会引起异常 你可以从变量窗口获得变量的值,调用堆栈定位到相关代码,然后分析什么原因导致的 必要时单步运行调试程序,分析原因
沉默的牧羊者 2016-01-08
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
点中断,然后通过变量窗口、调用堆栈观察分析原因,特别注意指针是否有效
还有,我想问一下这是一个什么问题,为什么会出现这种状况??谢谢帮助
沉默的牧羊者 2016-01-08
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
点中断,然后通过变量窗口、调用堆栈观察分析原因,特别注意指针是否有效
我这方面不是很熟,我会点中断,也会看监视,但是调用堆栈不太会呢,能教一下我调用堆栈有什么要点吗??
paschen 版主 2016-01-08
  • 打赏
  • 举报
回复
点中断,然后通过变量窗口、调用堆栈观察分析原因,特别注意指针是否有效

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧