二进制数据文件中的碎片(50分)

  • 主题发起人 主题发起人 Maxying
  • 开始时间 开始时间
M

Maxying

Unregistered / Unconfirmed
GUEST, unregistred user!
我想将用户输入的数据存入自定义的文件中,例如每次输入三个值,前两个值是定长的,最后一个是段文字不定长,像这样输入了5组数据。将它们顺序存入文件后,如果用户要修改第2组数据,会出现两种问题:那个不定长的变量缩短了,结果会使文件中出现一段空隙;而如果增长了,是否将增长的部分存到文件末尾或其他空隙中然后链过去呢?时间长了肯定会出现大量文件碎片,是否有其他解决办法呢?
例如,我做一个通讯录,没给人的信息包括一下结构
struct friend
{
char name[20];
int age;
char *info;
};
其中info成员的长度是不定的,如果我向文件中存了5条这样的记录,但我想修改其中的某一条时,如果其中的info成员的长度变了,我该怎么处理?
 
没人理我吗?好可怜啊!~~~
 
这种情况我一般都用两个文件, 第一个文件李放不定长数据的索引, 数据放在
第二个文件里.
 
能不能换另外一种方式?!
 
如果放在一个文件中呢?能做到吗?像硬盘的文件分配表和文件结构的管理,只不过它是预先分配了一定的空间存索引,可是在文件中我不可能预先分配很多的空间存放索引,而且如果预先分配的空间满了又该怎么办呢?
 
用自己的文件存储数据最痛苦了,我刚开始写程序的时候就是这样,费好大的精力啊
建议你还是早点换成数据库吧,桌面文件型的也好啊,DBISAM也好啊
 
同意楼上的, 我原来就是这样, 写好了以后发现程序在多任务时效率很低, 后来就改用
DBISAM了.[8D], 用一个BLOB字段存储数据, 这样很多事情都不用考虑了.
 
我的第一个程序,是很久以前用 Borland c++ 4.0 写的仓库管理的程序,没有数据库
用自己定义的格式的文件存储,bc++的owl和api也差不多了,哎呀,反正一言难尽,苦也
 
用数据库当然简单,但我总不能做什么软件都带个mdb文件吧,再说那样就没有什么安全性可言了。
像“电子书库”那样的软件是怎样将数据和索引存到同一个文件中的呢?不可能混着存吧,那样几十MB的文件打开一定相当慢了!
 
DBISAM数据库是可以加密的, 最多三个文件, 一个数据文件, 一个索引文件, 还有一个
存放BLOB型数据数据的文件
 
用自定义的文件,好处就是练了手:)
象那些查找、排序,好大功夫啊,
突然想起要改变一下数据结构,比如增加一些列,如果有数据了,
那么要自己写一个程序来转换……
总之都写出来了,算法提高很快的,我支持你:)
 
谢谢楼上的支持,其实我想做到一个文件中应该不是非常困难的事,随便编个小工具的话,大概没多少人会用数据库吧。
 
各位能不能说说具体的算法或思路
 
对不起,前面忘了换行,不好意思
 
有没有人能说说具体的算法呢?
小弟多谢了!!!
 
不要用char *info,改成 char info[最大的可能]
浪费一点硬盘空间问题不大吧,这样就简单很多了
 
文件碎片是注定要产生的,目前只能靠数据库重整(通常称为压缩)来解决。
编小程序的话不妨试试郝新庚的免费数据库TinyDB(tinyDB.yeah.net),限十万条记录。
 
To:pipi
我是想做成char info[最大的可能]这样的样子,虽然浪费些空间没什么,可有可能不够啊。
像“电子书库”不知道你是否用过,一篇文章我总不能留char txt[65536]吧。
其实产生碎片也没关系,问题是比如文件中放了3段文字,我将第二段文字删去一半,就会
出现一段碎片,而我如果加入第4段文字的话,是加到文件末尾还是第二段文字的后面?而且
如果要加入的文字超过了刚才的碎片长度,还要有一半存到文件末尾。这样的链表结构是不是
太混乱了?重要的是这样每次保存时都要遍历文件中闲置空间并向其中插入新数据的算法
应该怎样描述?
 
To:zfh
我看了TinyDB是英文版的,还是不大明白到底是个什么东东?
 
后退
顶部