怎样用fstream对二进制文件进行内容修改和删除?(100分)

  • 主题发起人 主题发起人 qlwy
  • 开始时间 开始时间
Q

qlwy

Unregistered / Unconfirmed
GUEST, unregistred user!
使用fstream可以对二进制文件进行读取、增补写入、全新写入,但是好像找不到
方法对二进制文件的内容进行部分修改和部分删除,请各位高手指教?
 
用TFileStream的writebuffer和readbuffer就可以进行读写了
 
文件指针定位读写,但可不能删除啊,除非截断后面的:)
 
用TFileStream的size属性可以控制文件大小,这样可以实现你的木的
 
二进制文件不是数据库,不能进行简单的删除添加,可以另外定义一个文件流,把当前文件流的需要数据Copy到新的流中.不需要的数据放弃!
 
或者把当前数据流中需要删除的数据后面的数据Copy到前面Overwrite需要删除的数据,然后把Size减小.
如果是增加就相反.
 
我用VC++编程,怎么用TFileStream?
 
VC可以使用CFile类,
 
FileStream确实很利害的,在tdxdbgrid里有一个SavetoXls的功能,速度非常的快,
我试着看看它的源代码,是用FileStream实现的,可惜我的功力不够,还看不出个所以然
dxdbgrid真是太历害了:),不知哪位大侠能解释一二?
 
char a[100];
fstream fs;
fs.open("abc.dat", ios::in |ios::out|ios::binary);
if(fs.is_open())
{
fs.seekoff(100, ios_base::beg);
fs.read(a, 100);
...
memset(a, 0, 100);
fs.seekoff(100, ios_base::beg);
fs.write(a, 100);
fs.close();
}
 
fe.read(fe + 10,fe.size - 10) //指针偏移,不懂D里如何用,C里用+,我在C用内
存映射试过可以这样做,不要将后面的空间设为空
fe.seek(10,2);
fe.write(0,10)
不知对不对
 
上面一篇来自VC论坛,我认为思路是对的,经过测试修改成这样(这里是删除部分的程序,修改部分因为较简单就不贴了):
int pos;
//用于定位删除内容的位置
fstream fs;
//输入输出文件流
char buf[sizeof(b1)];
//b1是一个类,实际上也就是一条记录,或者说就是要删除的那条记录
......
获取pos的过程
......
fs.open("abc.dat", ios::in |ios::out|ios::binary);
if(!fs){
cout<<"不能打开文件:"<<"abc.dat"<<'/n';
exit(1);
}
else
{
fs.seekg(pos, ios::beg);

fs.read((char*)&amp;buf,sizeof(b1));
memset(&amp;buf, 0, sizeof(b1));
//用空白代替被删除记录的内容
fs.seekp(pos, ios::beg);

fs.write((char*)&amp;buf,sizeof(b1));

fs.close();
}
 
to诸葛白痴:
能解释一下这两句吗?
fe.seek(10,2);
fe.write(0,10);
第一,fe.seek((10,2)中2是什么意思?从位置2开始往后移10个长度?
第二,fe.write(0,10)我觉得你的意思是用长度为10的一段空白覆写记录,并没有达到删除
这段记录的效果(而你的本意好像是删除后不要留空白)?
 
错了,应用seek(-10,2)
seek(-10,2)这里2的原型是sofromend,意思是将读写指针从文件结尾往前移10个单位,我
这只是将后10个地址设为0,如要真正减少那就用size属性
 
相同长度的修改或尾部添加没问题。在适当的地方写。
其它会涉及数据移动。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
824
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部