关于无法读取二进制文件的问题

沉默的牧羊者 2016-01-11 03:28:49
这里是存储


int m_length = 0;//记录字节数,用于移动指针

void SaveData()
{
T_Student t_std;
int stdnumber = head->GetStdNum();
fstream fdata;
fdata.open("E:\\StudentSystemData.orz", ios::out | ios::binary);
if (!fdata)
{
cerr << "File would not be open" << endl;
return;
}
fdata.seekp(0, ios::beg);

T_Student mark = {"", "", "", 0, 0, 0, 0, 0, 0};//标志结束

fdata.write((char*)&stdnumber, sizeof(int));
m_length = 4;
for (int i = 0; i < stdnumber; i++)
{
head->GetData(t_std.t_name, t_std.t_id, t_std.t_sex, t_std.t_phy, t_std.t_eng, t_std.t_math, t_std.t_cs, t_std.t_cproject);//这里是将类的对象的内容读取出来
SaveItem(&t_std);
head = head->next;
}
SaveItem(&mark);
}



void SaveItem(T_Student *t_std)
{
fstream fdata;
fdata.open("E:\\StudentSystemData.orz", ios::out | ios::binary);
if (!fdata)
{
cerr << "File would not be open" << endl;
return;
}
SaveString(t_std->t_name);
SaveString(t_std->t_id);
SaveString(t_std->t_sex);
fdata.seekp(m_length, ios::beg);
fdata.write((char*)&t_std->t_phy, sizeof(int));
fdata.write((char*)&t_std->t_eng, sizeof(int));
fdata.write((char*)&t_std->t_math, sizeof(int));
fdata.write((char*)&t_std->t_cs, sizeof(int));
fdata.write((char*)&t_std->t_cproject, sizeof(int));
m_length += 20;

fdata.close();
}



void SaveString(string &str)
{
fstream fdata;
fdata.open("E:\\StudentSystemData.orz", ios::out | ios::binary);
fdata.seekp(m_length, ios::beg);
int length = 0;
length = str.length();
length++;
fdata.write((char*)&length, sizeof(int));
fdata.write(str.c_str(), length-1);
fdata.write("\0", 1);
m_length += 4 + length;
fdata.close();
}




这里是读取

int m_length;//记录字节数,以便于指针的移动

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; //string 的长度
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;
}

...全文
698 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-01-12
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
paschen 版主 2016-01-12
  • 打赏
  • 举报
回复
引用 5 楼 Zelea 的回复:
[quote=引用 3 楼 paschen 的回复:] 那你要检查是否存对,如果不是字符串的值可以直接用二进制存与读 再另外,你读完一个数据,文件指针已经移到了读完后的位置了,注意计算位置是否出错
我发现了是路径的问题。 不好意思,又麻烦你了,我想问一下char*如何转换为string,谢谢你的帮助。。[/quote] 直接string一个变量等于char*变量,string构造函数里会完成转换
沉默的牧羊者 2016-01-11
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
那你要检查是否存对,如果不是字符串的值可以直接用二进制存与读 再另外,你读完一个数据,文件指针已经移到了读完后的位置了,注意计算位置是否出错
我发现了是路径的问题。 不好意思,又麻烦你了,我想问一下char*如何转换为string,谢谢你的帮助。。
沉默的牧羊者 2016-01-11
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
那你要检查是否存对,如果不是字符串的值可以直接用二进制存与读 再另外,你读完一个数据,文件指针已经移到了读完后的位置了,注意计算位置是否出错


void SaveData()
{
	fstream fdata;
	T_Student t_std;
	int stdnumber = head->GetStdNum();
	fdata.open("E:\\StudentSystemData.dat", ios::out | ios::binary);
	fdata.seekp(0, ios::beg);
	if (!fdata)
	{
		cerr << "File could not be open" << endl;
		return;
	}
	int len = 0;
	fdata.write((char*)&stdnumber, sizeof(int));
	while (head)
	{
		head->GetData(t_std.t_name, t_std.t_id, t_std.t_sex, t_std.t_phy, t_std.t_eng, t_std.t_math, t_std.t_cs, t_std.t_cproject);
		len = t_std.t_name.length();
		fdata.write((char*)&len, sizeof(int));
		fdata.write(t_std.t_name.c_str(), len);

		len = t_std.t_id.length();
		fdata.write((char*)&len, sizeof(int));
		fdata.write(t_std.t_id.c_str(), len);

		len = t_std.t_sex.length();
		fdata.write((char*)&len, sizeof(int));
		fdata.write(t_std.t_sex.c_str(), len);

		fdata.write((char*)&t_std.t_phy, sizeof(int));
		fdata.write((char*)&t_std.t_eng, sizeof(int));
		fdata.write((char*)&t_std.t_math, sizeof(int));
		fdata.write((char*)&t_std.t_cs, sizeof(int));
		fdata.write((char*)&t_std.t_cproject, sizeof(int));

		head = head->next;
	}

	fdata.close();
}

bool ReadData()
{
	fstream fdata;
	T_Student t_std;
	int len;
	int stdnumber;
	fdata.open("D:\\StudentSystemData.dat", ios::in | ios::binary);
	fdata.seekg(0, ios::beg);
	if (!fdata)///////////////////////////////////////////////////////////fdata会执行if语句里的,然后读取不到了
	{
		cerr << "File could not be open" << endl;
		return false;
	}
	fdata.read((char*)&stdnumber, sizeof(int));
	for (int i = 0; i < stdnumber; i++)
	{
		fdata.read((char*)&len, sizeof(int));
		fdata.read((char*)&t_std.t_name, len);

		fdata.read((char*)&len, sizeof(int));
		fdata.read((char*)&t_std.t_id, sizeof(int));

		fdata.read((char*)&len, sizeof(int));
		fdata.read((char*)&t_std.t_sex, sizeof(int));

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

		if (head == NULL)
		{
			head = new Student;
			head->SetData(t_std);
			phead = head;
			head = head->next;
		}
		else
		{
			head = new Student;
			head->SetData(t_std);
			head = head->next;
		}
	}
	head = phead;
	return true;
}



我尝试用另一种方法去写,但是这次是连读取文件都无效了,看看上面注释的部分,是不是我写的代码又出错了,我看了一下根目录,确实存在该文件,并且,我计算了一下,字节数也是正确的,为什么会这样,我为了这个文件的问题,已经用了3天的时间了,改了还几次代码,到今天还没有解决啊
paschen 版主 2016-01-11
  • 打赏
  • 举报
回复
那你要检查是否存对,如果不是字符串的值可以直接用二进制存与读 再另外,你读完一个数据,文件指针已经移到了读完后的位置了,注意计算位置是否出错
沉默的牧羊者 2016-01-11
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
void ReadItem(T_Student t_std) 是否应该为 void ReadItem(T_Student & t_std)
可能这也是其中一个问题,现在的最主要的问题我存储了之后,只能读取stdnumber,而其他的length读出来为0,
paschen 版主 2016-01-11
  • 打赏
  • 举报
回复
void ReadItem(T_Student t_std) 是否应该为 void ReadItem(T_Student & t_std)

64,639

社区成员

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

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