还是2进制文件的读写(50分)

  • 主题发起人 主题发起人 cmen
  • 开始时间 开始时间
C

cmen

Unregistered / Unconfirmed
GUEST, unregistred user!
http://delphibbs.com/delphibbs/dispq.asp?lid=2474078
最后的一帖,在把buf写入新文件时出现问题:
只要原文件里有#10,而该字符前面不是#13的,在新文件中总是变成#13#10,使新文件与原文件不符,请问该怎样处理?
 
你是用什么东西打开的文件,如果用ultraedit,则有可能是他帮你加上去的(可以看看他的设置)。
一般情况下是不会出现你说的情况。
 
因为是2进制文件,即使使用ultraedit打开文件也不可能会自动在文件内容中将#10变成#13#10吧?
 
procedure swapfile(sfile:String,tfile:String);
const
ec:char=#13;
var
sf,tf:File;
readnum,i1:integer;
///if you want rewrite source file
numwrite:integer

///////////////
fc:array[0..2047] of char
//file char;
begin
assignfile(sf,sfile);
reset(sf,1);
assignfile(tf,tfile);
rewrite(tf,1);
try
repeat
blockread(sf,fc,sizeof(fc),readnum);
if readnum>0 then begin
for i1:=0 to readnum-1 do begin
if fc[i1]=#10 then blockwrite(tf,ec,1);
blockwrite(tf,fc[i1],1);
end;
end;
until (readnum=0)or(readnum<>sizeof(fc));
finally
closefile(sf);
closefile(tf);
end;
/////if you want to rewrite source file, you can use copyfile() function or use like buttom. it's the dephi examp
assignfile(sf,tfile);
reset(sf,1);
assignfile(tf,sfile);
rewrite(tf,1);
try
repeat
blockread(sf,fc,sizeof(fc),readnum);
blockwrite(tf,fc,readnum,numwrite)

until (readnum=0) or (readnum<>numwrite);
finally
closefile(sf);
closefile(tf);
end;
////////////////
end;
 
to zzutrain:
如果按照你的方法,我不能对读出来的内容进行处理,再写入到新的文件中。

另,你的:
if fc[i1]=#10 then blockwrite(tf,ec,1);
blockwrite(tf,fc[i1],1);
似乎与我的意思反了。我的意思是读出来的内容如果有#0而前面没有#13的,在写入文件后就成了#13#10,即#FF#10变成#FF#13#10
 
var
readlast:char
//定义一个char 变量
firstread:Boolean
//

firstread:=True;
repeat
blockread(sf,fc,sizeof(fc),readnum);
firstread:=False;
if readnum>0 then begin
for i1:=0 to readnum-1 do begin
if fc[i1]=#10 then begin
if i1<>0 then begin
if fc[i1-1]<>#0 then blockwrite(tf,ec,1);
end else begin
if not firstread then begin
if readlast<>#0 then blockwrite(tf,ec,1);
end;
end;
end;
blockwrite(tf,fc[i1],1)
//补充说明, 只是新文件多加一个#13,原来的数据一直都被写入新文件
lastchar:=fc[readnum-1]
//加在for 循环之后

end;
end;
 
你看懂代码就知道如何改写了。
 
我是菜鸟一个,真的还看不懂,要慢慢领悟一下
 
说说我的思路。
先按byte读取方式打开原文件,
每次读取2k字节,然后对读取的字节进行判断,如果该字节是#10,判断前面是否是#13, 如果不是在新文件中写入#13字符,
如果此次读取的第一个字节就是#10,判断是否是第一次读文件,如果不是,判断上次读出来的最后一个字节是否是#13, 如果不是写入#13字符。
把原来的数据写入文件。
例如
#1 #2 #10 #13
运行后变成#1 #2 #13 #10 #13

 
后退
顶部