学C++没多久,遇到一个对二进制文件的问题无法解决

southbirdfly 2008-04-09 09:14:47
下面的程序cpp2,编译的时候没有问题,运行时总是提示内存不能为read,百思不得其解,希望大家帮忙。谢谢大家。

//cpp1
#include<fstream>
#include<iostream>
using namespace std;
struct student
{ char name[20];
int num;
int age;
char sex;
};
int main()
{ student stud[3]={"Li",1001,18,'f',"fun",1002,19,'m',"Wang",1004,17,'f'};
ofstream outfile("stud.dat",ios::binary);
if(!outfile)
{cerr<<"open error!"<<endl;
abort();
}
for(int i=0;i<3;i++)
outfile.write((char*)&stud[i],sizeof(stud[i]));
outfile.close();
system("pause");
return 0;
}


//cpp2
#include<iostream>
#include<fstream>
using namespace std;
struct student
{ string name;
int num;
int age;
char sex;
};
int main()
{student stud[3];
int i;
ifstream infile("stud.dat",ios::binary);
if(!infile)
{cerr<<"open error!"<<endl;
abort();
}
for( i=0;i<3;i++)
infile.read((char*)&stud[i],sizeof(stud[i]));
infile.close();
for(i=0;i<3;i++)
{cout<<stud[i].name<<endl;
cout<<stud[i].num<<endl;
cout<<stud[i].age<<endl;
cout<<stud[i].sex<<endl;
}
system("pause");
return 0;
}

...全文
101 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlbertWoo 2008-05-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 arong1234 的回复:]
因为string内包含指针,指针只在当前运行上下文有效,你一旦保存指针,读回来就要求你的新对象也指向原来那个地址,而此时那个地址可能已经给别人用了。即使别人没有用,原来的地址也不会恰好保存你string对象原来所有的内存

引用 4 楼 southbirdfly 的回复:
谢谢1楼的回答,程序没问题了。可我不明白为什么不能用 string,而一定要用char[]? 能不能详细说明一下?

[/Quote]
我还是不明白。是不是string 的实现用到了指针的?还是.. ?如果我一定要用指针,可不可以通过重载 operator= 实现?
arong1234 2008-04-10
  • 打赏
  • 举报
回复
不知道怎么可以再详细,有些东西指望别人讲明白是不现实得,自己得去思考,你不思考,再详细你也不明白

[Quote=引用 6 楼 southbirdfly 的回复:]
谢谢阿荣大哥,有点明白了。。。如果可以的话,我希望可以讲得更加详细一点,呵呵。。。。
[/Quote]
chary8088 2008-04-09
  • 打赏
  • 举报
回复
string is class type, not built-in;

outfile.write((char*)&stud[i],sizeof(student);
--->
outfile.write((char*)&stud[i],sizeof(stud[i]));

infile.read((char*)&stud[i],sizeof(stud[i]));
--->
infile.read((char*)&stud[i],sizeof(student);
IT_lau 2008-04-09
  • 打赏
  • 举报
回复
xx
southbirdfly 2008-04-09
  • 打赏
  • 举报
回复
谢谢阿荣大哥,有点明白了。。。如果可以的话,我希望可以讲得更加详细一点,呵呵。。。。
arong1234 2008-04-09
  • 打赏
  • 举报
回复
因为string内包含指针,指针只在当前运行上下文有效,你一旦保存指针,读回来就要求你的新对象也指向原来那个地址,而此时那个地址可能已经给别人用了。即使别人没有用,原来的地址也不会恰好保存你string对象原来所有的内存

[Quote=引用 4 楼 southbirdfly 的回复:]
谢谢1楼的回答,程序没问题了。可我不明白为什么不能用 string,而一定要用char[]? 能不能详细说明一下?
[/Quote]
southbirdfly 2008-04-09
  • 打赏
  • 举报
回复
谢谢1楼的回答,程序没问题了。可我不明白为什么不能用 string,而一定要用char[]? 能不能详细说明一下?
djwinter 2008-04-09
  • 打赏
  • 举报
回复
第一个程序没有问题,但是写入的文件并不是那些字符串,你要考虑内存对齐

第二个程序读文件的时候发生异常
huangxiaofei 2008-04-09
  • 打赏
  • 举报
回复
程序一可以运行,能正常运行结束并生成文件。
ttkk_2007 2008-04-09
  • 打赏
  • 举报
回复

struct student
{ char name[20]; //是char[],不是string
int num;
int age;
char sex;
};
int main()
{student stud[3];
int i;
ifstream infile("stud.dat",ios::binary);
if(!infile)
{cerr <<"open error!" <<endl;
abort();
}
for( i=0;i <3;i++)
infile.read((char*)&stud[i],sizeof(stud[i]));
infile.close();
for(i=0;i <3;i++)
{cout <<stud[i].name <<endl;
cout <<stud[i].num <<endl;
cout <<stud[i].age <<endl;
cout <<stud[i].sex <<endl;
}
return 0;
}

相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-09 09:14
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下