免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1229 | 回复: 4
打印 上一主题 下一主题

问在线问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-01 20:16 |只看该作者 |倒序浏览
如下方式,把Class的所有对象以"块"方式写入3.txt
但是我不能以"块"方式读出.且有异常.
我以二进制创建文件.

写如程序
/***********************************************************************/
#include <iostream>;
#include <fstream>;
#include <cstring>;
#include <cassert>;
using namespace std;

class Class{
        string i_name;
public:
        Class(const string&amp; str)
                :i_name(str){}
        Class(){}
        const string get()const{return i_name;}
        friend ostream&amp; operator<<(ostream&amp; os,const Class&amp; right){
                os<<right.get().c_str();
                return os;
        }
};
//////////////////////////////////////////////////////////////////////////////////////////////
void main(){
        Class o[]={"China","USA","RUSSIA"};
        Class p[3];
       
        fstream file("3.txt",ios::binary|ios::in|ios:ut);

        for(int j=0; j<sizeof(o)/sizeof(*o); j++){
                file.seekp(j*sizeof(Class),ios::beg);
                file.write((char*)&amp;o[j],sizeof(Class) );
        }
        file.flush();
}

读出程序
/**********************************************************************/
#include <iostream>;
#include <fstream>;
#include <cstring>;
#include <cassert>;
using namespace std;

class Class{
        string i_name;
public:
        Class(const string&amp; str)
                :i_name(str){}
        Class(){}
        const string get()const{return i_name;}
        friend ostream&amp; operator<<(ostream&amp; os,const Class&amp; right){
                os<<right.get().c_str();
                return os;
        }
};
//////////////////////////////////////////////////////////////////////////////////////////////
void main(){
        Class p[3];
       
        fstream file("3.txt",ios::binary|ios::in|ios:ut);

        for(int i=0; i<3; i++){
                file.seekg(i*(sizeof(Class)),ios::beg);
                file.read((char*)&amp;p,sizeof(Class));
        }

        for(i=0; i<3; i++)
                cout<<p<<endl;

}

论坛徽章:
0
2 [报告]
发表于 2003-03-02 09:42 |只看该作者

问在线问

因为有string i_name;

而string 是动态分配内存的
里面保留有指针

再次读出时string 内的指针指向地址已不再可用
所以会有异常

论坛徽章:
0
3 [报告]
发表于 2003-03-03 14:10 |只看该作者

问在线问

那有办法正确实现类似的读写"块"操作的方法吗?

论坛徽章:
0
4 [报告]
发表于 2003-03-03 17:24 |只看该作者

问在线问

如果有指针的话是没有办法

写入时应该把指针内容去掉
换成相应的地址的内容

论坛徽章:
0
5 [报告]
发表于 2003-03-03 20:41 |只看该作者

问在线问

如果不用指针呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP