社区
C++ Builder
帖子详情
郁闷 深入讨论文件结构的问题 季老大 捧场 非常急
BoyMgl
2003-08-02 10:19:38
我需要一个文件结构
1、存储相关信息(SInfo)
2、存储数据(SData)
但是我要写入的不止一个SData,这个数目是可变的,请问怎么办?
如何度曲?
...全文
89
17
打赏
收藏
郁闷 深入讨论文件结构的问题 季老大 捧场 非常急
我需要一个文件结构 1、存储相关信息(SInfo) 2、存储数据(SData) 但是我要写入的不止一个SData,这个数目是可变的,请问怎么办? 如何度曲?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的数目与长度(或:定义数据的分割标志)不就得了吗?
数据
结构
电子教案,物超所值,机不可失,多多
捧场
数据
结构
电子教案,物超所值,机不可失,多多
捧场
清华大学-数据
结构
-传统
清华大学 数据
结构
,非常传统的教程,大家
捧场
数据库,物超所值,机不可失,多多
捧场
数据库,物超所值,机不可失,多多
捧场
11111111111111111111
办公自动化文字来了加油
捧场
看看\新建
文件
夹\《办公自动化》文字录入测试.exe 办公自动化文字来了加油
捧场
办公自动化软件
计算机组成原理,物超所值,机不可失,多多
捧场
计算机组成原理,物超所值,机不可失,多多
捧场
1111111111111111
C++ Builder
13,825
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章