社区
C++ Builder
帖子详情
郁闷 深入讨论文件结构的问题 季老大 捧场 非常急
BoyMgl
2003-08-02 10:19:38
我需要一个文件结构
1、存储相关信息(SInfo)
2、存储数据(SData)
但是我要写入的不止一个SData,这个数目是可变的,请问怎么办?
如何度曲?
...全文
94
17
打赏
收藏
郁闷 深入讨论文件结构的问题 季老大 捧场 非常急
我需要一个文件结构 1、存储相关信息(SInfo) 2、存储数据(SData) 但是我要写入的不止一个SData,这个数目是可变的,请问怎么办? 如何度曲?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
清华大学-数据
结构
-传统
清华大学 数据
结构
,非常传统的教程,大家
捧场
算法设计与分析电子教案,物超所值,机不可失,多多
捧场
算法设计与分析电子教案,物超所值,机不可失,多多
捧场
QT中文文档+QT设计教程+creator使用教程
这个3个都是中文版的教程,相信很多朋友都不太愿意看E文,文档时QT3时的,虽然有些老,但我觉得还是很具有参考价值的,设计教程比较比较基础,还有一本关于环境的书,希望大家多多
捧场
,以后还会传些最近的英文文档
C++ Builder
13,870
社区成员
102,693
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章