郁闷 深入讨论文件结构的问题 季老大 捧场 非常急

BoyMgl 2003-08-02 10:19:38
我需要一个文件结构
1、存储相关信息(SInfo)
2、存储数据(SData)
但是我要写入的不止一个SData,这个数目是可变的,请问怎么办?
如何度曲?
...全文
89 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
BoyMgl 2003-08-05
  • 打赏
  • 举报
回复
多谢!!!!!教讳!
我已经明白了!
copy_paste 2003-08-05
  • 打赏
  • 举报
回复
哦,没说清

一般写动态数据时,一般是分开size和data来写的:
// int size
// char *data;
Stream->WriteBuffer(&size, sizeof(size));
Stream->WriteBuffer(data, size);
...

而读数据也是分开来读:
int size;
Stream->ReadBuffer(&size, sizeof(size));
char *data = new char[size];
Stream->ReadBuffer(data, size);
...

如果是需要结构类型的话,需要保留出data域,不能忽略
TDyncData Buffer;
Buffer.size = size;
Buffer.data = data;
Stream->WriteBuffer(&Buffer, sizeof(Buffer));
Stream->WriteBuffer(data, Buffer.size);

读的时候
TDnycData Buffer;
Stream->ReadBuffer(&Buffer, sizeof(Buffer));
char *data = new char[Buffer.size];
Buffer.data = data;
Stream->ReadBuffer(data, Buffer.size);

前面的那种结构是size之后,紧接着就是data,而后面则是将data指针占用了size后面的4字节,然后才是真正的data,因为有些情况是需要有定义的结构,然后才是数据(后面的情况),所以,会这种情况.

你还是多试试,不然偶也是白搭
mme 2003-08-04
  • 打赏
  • 举报
回复
我好像看到错别字一大堆.....

没人理会是因为他们觉得已经说得很明白了,可是你却还是不明白:)

为什么不自己动手,试验解决呢!

我觉得根本不是什么难题,除非你从来就没有用过......

如果说错了,请多多包涵 ^_^
BoyMgl 2003-08-04
  • 打赏
  • 举报
回复
真奇怪?怎么总是美人理呢?为什么我的贴子会下沉呢?
我顶!
jiangchun_xn 2003-08-04
  • 打赏
  • 举报
回复
我自己写过一个摸版类,转本在文件中存储数据结构,支持头部信息,LRU缓冲,其实主要是你认识到在文件中数据结构指针就是一个整数值--文件中的位置,把以前会的数据结构转过来就行了。
iting 2003-08-04
  • 打赏
  • 举报
回复
如果你单个的纪录是定长的,或者变长但是有最大长度,那么可以在写入和读取是采用固定最大缓冲的办法减少内存再分配,提高效率,并可减少内存碎片产生,增强稳定性。
如下:
//注意:本文件开头要用 #pragma pack(1)指示编译器按1字节方式打包。
// 最后的时候可以再恢复编译器默认值
// 同时自己注意内存地址对齐,不要让你的结构占用奇数长度的内存。
BYTE Buf[Max_Buf_Len];
typedef sturct tagTemp
{
int len;
BYTE p[0]; //非标准用法。这个地方也可以是你的SData结构。
//如:SDATA sData[0];
}TEMP,*PTEMP;
PTEMP pTmp = PTEMP(Buf);
.....
BoyMgl 2003-08-04
  • 打赏
  • 举报
回复
to copy_paste(木石三) ( ) :
你的意思是char *也可以写入文件?但是char*只有四字节,四用来存储地址的,存入文件后读出来的怎么会是字符呢?
gfh21cn 2003-08-04
  • 打赏
  • 举报
回复
typedef struct tagTemp
{
char p[];
int i;
} TEMP;


最好指明多少个
copy_paste 2003-08-04
  • 打赏
  • 举报
回复
一般是定义好你的数据的结构,然后再写入文件,读的时候,根据你的结构来读。
结构是定长的就是这样,如果是不确定的,一般是先写入后面数据的长度,然后再写数据,这样,读的时候,先将长度读出来,然后申请那么长的内存,再将后面的数据读出。

typedef struct
{
char v1[20];
int v2;
unsigned v3;
...
}TStaticData;

typedef struct
{
int dataLen;
char *data;
}TDyncData;

上面的TStaticData是静态长度的,所以无所谓,因为一个TStaticData变量占用文件的长度可以用: sizeof(TStaitcData)取得,
而TDyncData则不行,所以,用了一个datalen来表示后面的数据的长度,第一,先将数据长度从文件读出,然后来继续读出那么长的内容。

基本是这样。
BoyMgl 2003-08-04
  • 打赏
  • 举报
回复
又没人理,我顶,我顶!
希望大家帮忙顶一下!
BoyMgl 2003-08-03
  • 打赏
  • 举报
回复
多谢!
直到倒数第2个逗号我都会操作,可是:
1、是否药用fseek来重新定义读取位置?
2、知道个数后,怎样使用fread读取那么多结构?
3、定义结构时,这样是否合法?
typedef struct tagTemp
{
char p[];
int i;
} TEMP;
jishiping 2003-08-03
  • 打赏
  • 举报
回复
先写入SInfo,然后写入一个整数,表示SData的个数或者是所有SData的数据长度。读取时,
先读取SInfo,然后读取一个整数,根据读取的整数,就知道了后面的SData的个数了。
BoyMgl 2003-08-03
  • 打赏
  • 举报
回复
怎么没有人理?
我顶!
BoyMgl 2003-08-02
  • 打赏
  • 举报
回复
to pp616(傻小子) ( )
怎样写入(用fwrite)
怎样读取(用fread)
BoyMgl 2003-08-02
  • 打赏
  • 举报
回复
多谢指点迷津!
请问长度是治水的长度?
分割标志又应如何度曲?
*1、劳烦写出代码?不胜感激!
2、用XML好像也可以实现,应如何操作?
pp616 2003-08-02
  • 打赏
  • 举报
回复
SInfo+SDataLength+SData+......+SData
qibo999 2003-08-02
  • 打赏
  • 举报
回复
建一个表格记录SData的数目与长度(或:定义数据的分割标志)不就得了吗?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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