请高手回答原则性问题,非高手莫进(10分)

  • 主题发起人 主题发起人 abcok
  • 开始时间 开始时间
A

abcok

Unregistered / Unconfirmed
GUEST, unregistred user!
是否任意一个自定义的二进制文件,都需要有一个文件头来保存各个数据块的起始位置,才可以随意操作这个文件?
 
在流式数据中,这个应该没有必要
 
看来有必要多给分,我会在其他贴子给的.
楼上的两位请举个简单例子
 
ff:file
// --------------
assignfile(ff,'...')
{$I-} reset(ff,1);
if ioresult<>0 then rewrite(ff,1);
blockread(ff,buff,size,result);
blockwrite(ff,buff,size,result);
closefile(ff);

fi:integer
//------------
fi:=FileOpen(mmPath+cTamRecord,fmOpenReadWrite);
if fi=-1 then fi:=FileCreate(mmPath+cTamRecord);
result:=FileRead(fi,buff,size);
result:=filewrite(fi,buff,size);
fileclose(fi);
 
还有
seek(ff,position);
FileSeek(fi,position,mode);
 
首先声明我不是高手,但我还是进来看了,不好意思。。。
我觉得,其实。。。所谓的二进制文件,我认为只是所谓的。。只是逻辑上的。。。
举个例子,在windows&amp;dos操作系统(FAT格式)文件在磁盘上是这样保存的。。。

--->系统区域:
1。文件目录表,里面记录了文件名,属性等信息,最重要的,有一个地方,就是
说明这个文件占用的第一个‘簇’(磁盘分配单位)的位置。。
2。文件分配表(一式两份),里面保存了所有的磁盘‘簇’的使用情况,假设按照上面
的目录表里面找到了第一个簇,然后就要在这个分配表里面找到对应这个簇的表项,
如果这个文件只占用了一个簇,对应的表项就是‘已占用且是最后一个簇’,如果文件
大于一个簇,这第一个簇对应的表项存储的就是下一个簇的位置,然后操作系统会跳到
下个簇对应的表项,看他是‘已占用且是最后一个簇’还是‘已占用且下一个簇是XXX’
直到遇到‘已占用且是最后一个簇’的表项为止。。。。。

----->数据区域(是n个簇的序列)
这部分是用来保存文件本身的内容的,我们所谓读写文件,操作的就是这部分,磁盘上
读写文件是以‘簇’(1簇为1~n个扇区)为单位的,每次读写都是至少一个扇区,也就是说
假设我们在程序中建立的文件只写了4字节就关闭保存了,实际底层还是占了一个‘簇’
也就是n*512字节,那么怎么知道有用的数据(就是那4个字节)长度呢?我想,首先前面
提到的‘文件目录表’里面就保存了这样的信息。。。。这就足够了。。。。

我认为,所有的文件本质上都是‘二进制文件’,都是保存在磁盘上的二进制字节序列,无论
什么文件,本质上都是一样的。。。只是规定了不同的格式(扩展名不不是主要的),不同的
格式就有了不同的读写方法(规则),所谓什么‘文本文件’、‘记录文件’,只是高级语言
里面规定的,为了是操纵不同类型文件的时候方便而已。。。如果我们把一个‘文本文件’当作
‘二进制’或所谓的‘记录型文件’来读,是否能正确读出来? 答案是肯定的,只是提供的
读写函数的用法不同(为了方便不同的需要,逻辑上的‘不同类型’的文件,每次读的长度单位等等 不同)

所以,我们保存文件,只要管我们实际写到文件里面哪些东西,什么格式的,到时候按照这个自
己规定的格式就可以读出来 ,不过我对delphi操作文件的方式不是很了解,不知道是否加
入了自己的一些东西。。。

(实际可以把文件想象成一段连续的内存区域 Buffer :array [] of byte)
 
参考例子: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2525584
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2524182
 
刘兄说的好。不过还是有n多人不明白这点...
 
要不要文件头这是你自己的事情,如果你的二进制文件是有规律的.
如:每四个字节一段信息,你看还有没有必要要文件头呢???
 
有文件头是为了不同程序间共享。如果仅仅是一个软件自己用,文件头实际上可以编码写在程序里。
有文件头,是一个好习惯。
 
多人接受答案了。
 
后退
顶部