相同的blockwrite语句用delphi和borland Pascal编译的结果为什么不同?(100分)

  • 主题发起人 主题发起人 YL_YAN
  • 开始时间 开始时间
Y

YL_YAN

Unregistered / Unconfirmed
GUEST, unregistred user!
用blockwrite(f,w,8)把相同的字符串w写入二进制文件f中,源文件分别用delphi和borland Pascal 7编译,二进制文件f用uedit打开,结果不同:

borland Pascal编译写入文件f的八个字节为
07 00 D7 F8 B1 EA BI ED

delphi编译写入文件f的八个字节为
8C 2E E1 04 20 FE 12 00

pas源文件的语句“uses dos”在delphi编译时被删掉,
相同的blockwrite语句用delphi和borland Pascal编译的结果为什么不同?
 
把代码贴出来才好帮你分析
 
以下代码用Borland Pascal 7编译后,用uedit打开文件ct(16进制编辑)为:
07 00 D7 F8 B1 EA BI ED,相同的代码用delphi编译,却不会一样,为什么?



program y;

uses dos;

var
f : File;
w :string;

begin
Assign(f,'ct');
Rewrite(f,1);
Reset(f,1);
w:='坐标表';
Insert(#000,w,0);
Blockwrite(f,w,8);
close(f);

end.
 
这是在程序移植出现的问题,dos程序生成文件的格式没错,window程序生成文件的格式有错。
 
把w:='坐标表' 、 Blockwrite(f,w,8)分别改成w:='1'、Blockwrite(f,w,2),用uedit打开文件ct(16进制编辑),结果如下:78 E8(delphi), 02 00(BP7).
 
delphi要写
blockwrite(f,@w[1],8)
 
Assign(f,'ct');
这一句在delphi下不报错吗? 好像变成了Assignfile(f,'ct'); 吧?
 
控制台程序下还真的是可以用Assign
 
没错,是Assignfile(f,'ct'),但在主程序uses d; 而d.pas(如下)就可以用Assign(f,'ct');

Unit d;
Interface
Type
................................
Implementation
Var
ff : File;
w : string;
var
f : File;
w :string;
begin
Assign(f,'ct');
Rewrite(f,1);
Reset(f,1);
w:='坐标表';
Insert(#000,w,0);
Blockwrite(f,w,8);
close(f);
end;
 
uses
SysUtils;

var
f : File;
w :string;
buf: array [0..255] of char;
begin
Assign(f,'ct.txt');
Rewrite(f,1);
//Reset(f,1); //没有必要
w:='坐标表';
//Insert(#0,w,7); //没有必要
StrCopy(buf,PChar(w));
Blockwrite(f,buf,length(w));
close(f);
end.
 
Insert(#000,w,0)的目的是写入八个字节“07 00 D7 F8 B1 EA BI ED”,这是二进制文件格式要求的,就是说生成文件的格式要求是 “07 00 D7 F8 B1 EA BI ED”,StrCopy(buf,PChar(w))这段代码只是写入“D7 F8 B1 EA BI ED” ,不满足要求。
 
上面用@操作符取出地址的做法能不能写入八个字节“07 00 D7 F8 B1 EA BI ED”?
 
下面dpr文件delphi编译运行后,用uedit打开文件ct(16进制编辑)为:
48 09 8F 00 00 00 00 00,而前面用Borland Pascal 7编译后的结果为:
07 00 D7 F8 B1 EA BI ED,一个是uses SysUtils, 另一个是uses dos,
看来Insert(#000,w,0)和Blockwrite(ff,w,8)两句在sysutils和dos中效果
不同,在w前插入#000的效果在sysutils和dos中解释不一样,对不对?

program y;
uses SysUtils;
var
ff : File;
w :string;
begin
Assign(ff,'ct');
Rewrite(ff,1);
w:='坐标表';
Insert(#000,w,0);
Blockwrite(ff,w,8);
close(ff);
end.
 
分别在delphi和bp7中逐行跟踪发现,Insert(#000,w,0)这行运行完后,
两者的w都为 #0'坐标表', 但length(w)值不同,delphi为length(w)=6,而
bp7为length(w)=7, 可见SysUtils和dos在length的定义不同,对不对?
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部