CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

存储自定义结构出错

楼主orcher(orcher)2005-12-26 00:56:28 在 C++ Builder / 基础类 提问

typedef   struct   AList  
  {  
      int   iNO;  
      AnsiString   aName;  
  }   TAList;  
  每次把结构存储到文件中,再重新读去的时候就出错,是不是ansiString不能放到结构种? 问题点数:50、回复次数:8Top

1 楼netsys2(来电!)回复于 2005-12-26 09:31:31 得分 20

是ansiString是个类,存储的是类对象地址,是没有用的,应该改为  
   
  typedef   struct   AList  
  {  
  int   iNO;  
  char   aName[80];  
  }   TAList;Top

2 楼constantine(飘遥的安吉儿)回复于 2005-12-26 09:45:48 得分 0

同意,bcb中好像不可以像delphi中一样是用shortstring,不然也可以使用Top

3 楼hongss(笑霸王)回复于 2005-12-26 09:57:39 得分 2

呵呵,我前几天也碰到这个问题。  
  在几位星星的指导下完成了。  
   
  就像netsys2(来电!)大大那样做就可以了。  
  Struct不支持复杂类型。Top

4 楼whitelion(www.ccproj.com)回复于 2005-12-26 10:00:18 得分 4

我一直用String变量  
  将你的代码写成  
   
  typedef   struct   AList  
  {  
      int   iNO;  
      String   aName;  
  }   TAList;  
  Top

5 楼constantine(飘遥的安吉儿)回复于 2005-12-26 10:07:21 得分 4

typedef   AnsiString                       String;                       //  
  应该是ShortString吧,我记得bcb也有的,不过用起来不太一样  
  String   从上面看不是等价   AnsiString   码Top

6 楼orcher(orcher)回复于 2005-12-26 10:19:58 得分 0

那如果aName是不定长的呢,有可能超过自己定义的任何量啊Top

7 楼netsys2(来电!)回复于 2005-12-26 10:36:10 得分 0

如果aName是不定长的呢,有可能超过自己定义的任何量啊  
  ----->  
   
  方法一:估计最长的数据长度来设置char   aName[80];  
   
  方法二:重新设计结构  
   
  typedef   struct   AList  
  {  
  int   iNO;  
  int   iNameLen;  
  char   *aName;  
  }   TAList;  
   
  写文件时,先写前面的  
  int   iNO;  
  int   iNameLen;  
   
  然后再根据iNameLen写aName,  
   
  就是说每次写盘操作得做两次。  
   
  读也是一样,先读int   iNO;int   iNameLen;  
   
  再根据iNameLen读出aName数据。  
  Top

8 楼songhtao(三十年孤独)回复于 2005-12-26 10:56:25 得分 20

你可以从TComponet继承写一个类然后用持久化的方法保存。  
   
  This   example   shows   how   to   use   the   built-in   VCLCLX   component   streaming   support   to   convert   any   component   into   a   string   and   convert   that   string   back   into   a   component.  
   
   
   
  AnsiString   ComponentToString(TComponent   c)  
   
   
   
  {  
   
    AnsiString   as;  
   
    TMemoryStream*   pms   =   new   TMemoryStream();  
   
    TStringStream*   pss   =   new   TStringStream(as);  
   
   
   
    try  
   
    {  
   
          pms->WriteComponent(&c);  
   
          pms->Seek(0,   soFromBeginning);  
   
          ObjectBinaryToText(pms,   pss);  
   
          pss->Seek(0,   soFromBeginning);  
   
          as   =   pss->DataString;  
   
    }  
   
    catch(...)  
   
    {  
   
          ShowMessage("Streaming   error.");  
   
    }  
   
   
   
    delete   pms;  
   
    delete   pss;  
   
    return   as;  
   
  }  
   
   
   
  TComponent   StringToComponent(AnsiString   as)  
   
   
   
  {  
   
    TMemoryStream*   pms   =   new   TMemoryStream();  
   
    TStringStream*   pss   =   new   TStringStream(as);  
   
    TComponent   *pc;  
   
   
   
    try  
   
    {  
   
          ObjectTextToBinary(pss,   pms);  
   
          pms->Seek(0,   soFromBeginning);  
   
    }  
   
    catch(...)  
   
    {  
   
          ShowMessage("Streaming   error.");  
   
    }  
   
   
   
    pc   =   pms->ReadComponent(NULL);  
   
    delete   pms;  
   
    delete   pss;  
   
    return   *pc;  
   
  }  
   
  Top

相关问题

  • 为什么我delete一个自定义的结构的时候出错呢???
  • 自定义事件出错?
  • 自定义消息出错
  • 自定义的数据结构该怎样存储进数据库?
  • 自定义的数据结构该怎样存储进数据库?(续)
  • 为什么自定义函数出错
  • 怎么自定义消息出错啊!
  • 自定义控件继承时出错!!!
  • 何定义灵活自定义的工程流中窗体数据存储结构
  • 如何定义灵活自定义的工程流中表单数据存储结构

关键词

  • 结构
  • component
  • streaming
  • pc
  • aname
  • inamelen
  • pss
  • talist
  • ansistring
  • tstringstream

得分解答快速导航

  • 帖主:orcher
  • netsys2
  • hongss
  • whitelion
  • constantine
  • songhtao

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo