其中有几个PChar是作为最后的结果输出,有几百个字节(确切长度已知),我需要把这些结果保存到文件里,试用了blockwrite方法如下:
………………………………
Assignfile(file_name,'der_pkcs10.cer'); //'der_pkcs10.cer'为欲保存的文件名
Rewrite(file_name,der_pkcs10Size^); //der_pkcs10Size为包含输出结果大小的PInteger变量
blockwrite(file_name,der_pkcs10^,1); //der_pkcs10为包含输出结果的PChar变量
closefile(file_name);
好像写出来的文件格式不对的,本来.cer是windows的证书文件,可是windows说文件无效,无法打开,我拿UltraEdit比较了我生成的.cer和windows导出的正确cer文件,发现除开始两个字节以外都不一样。
另外,当我这样保存了一个文件以后(先不管文件到底正确与否),使用中需要再从文件中读出内容送给另外的验证程序,验证程序的输入也是一个PChar变量,怎样读出来文件内容送给这个PChar变量呢?我又试用了blockread的方法如下:
assignfile(tempfile,'der_pkcs10.cer');
der_pkcs10Size:=sizeof(tempfile);
reset(tempfile,der_pkcs10Size);
blockread(tempfile,der_pkcs10,1);
closefile(tempfile);
这里的der_pkcs10变量是PChar类型,同样是作为保存证书的内容,可是我一运行这段程序就会非法内存操作,同时跳出CPU view窗口,该怎样正确读取呢?
9 个解决方案
#1
把 der_pkcs10Size^ 改成 der_pkcs10Size,去掉“^”
#2
不行啊,der_pkcs10Size是个PInteger类型的变量,去掉“^”的话编译器就会报错了,提示Incompatible types!!!
#3
把 der_pkcs10Size^ 改成 der_pkcs10Size[0]
assignfile(tempfile,'der_pkcs10.cer');
der_pkcs10Size:=得到文件长度;
reset(tempfile,der_pkcs10Size);
strnew(der_pkcs10,der_pkcs10Size);
blockread(tempfile,der_pkcs10,1);
strdispose(der_pkcs10,der_pkcs10Size);
closefile(tempfile);
assignfile(tempfile,'der_pkcs10.cer');
der_pkcs10Size:=得到文件长度;
reset(tempfile,der_pkcs10Size);
strnew(der_pkcs10,der_pkcs10Size);
blockread(tempfile,der_pkcs10,1);
strdispose(der_pkcs10,der_pkcs10Size);
closefile(tempfile);
#4
example
var p:pchar;
f:file ;
len:integer;
begin
p:='12345';
assignfile(f,'c:\test.dat');
rewrite(f,1);
blockwrite(f,p^,strlen(p));
closefile(f);
assignfile(f,'c:\test.dat');
reset(f,1);
len:=filesize(f);
p:=StrAlloc(len+1);
blockread(f,p^,len);
p[len]:=#0;
closefile(f);
strdispose(p);
end;
//p^=p[0]
var p:pchar;
f:file ;
len:integer;
begin
p:='12345';
assignfile(f,'c:\test.dat');
rewrite(f,1);
blockwrite(f,p^,strlen(p));
closefile(f);
assignfile(f,'c:\test.dat');
reset(f,1);
len:=filesize(f);
p:=StrAlloc(len+1);
blockread(f,p^,len);
p[len]:=#0;
closefile(f);
strdispose(p);
end;
//p^=p[0]
#5
谢谢zjqyb,你的两个回复都是说读取文件,但是第一个里面提到的“把 der_pkcs10Size^ 改成 der_pkcs10Size[0]”是说写文件时要改的吗?der_pkcs10Size是PInteger,但是der_pkcs10Size[0]是char类型的,编译器还是会说类型不匹配啊
#6
OK,使用zjqyb给的example已经可以成功读写二进制文件,谢谢你的帮助。不过我对你的第一个回复仍不理解,“把 der_pkcs10Size^ 改成 der_pkcs10Size[0]”是什么意思?还有strnew函数只能带一个参数啊!!
#7
在结帖前能否再解释一下?
^_^
^_^
#8
der_pkcs10Size^ =der_pkcs10Size[0]
#9
哦^_^
#1
把 der_pkcs10Size^ 改成 der_pkcs10Size,去掉“^”
#2
不行啊,der_pkcs10Size是个PInteger类型的变量,去掉“^”的话编译器就会报错了,提示Incompatible types!!!
#3
把 der_pkcs10Size^ 改成 der_pkcs10Size[0]
assignfile(tempfile,'der_pkcs10.cer');
der_pkcs10Size:=得到文件长度;
reset(tempfile,der_pkcs10Size);
strnew(der_pkcs10,der_pkcs10Size);
blockread(tempfile,der_pkcs10,1);
strdispose(der_pkcs10,der_pkcs10Size);
closefile(tempfile);
assignfile(tempfile,'der_pkcs10.cer');
der_pkcs10Size:=得到文件长度;
reset(tempfile,der_pkcs10Size);
strnew(der_pkcs10,der_pkcs10Size);
blockread(tempfile,der_pkcs10,1);
strdispose(der_pkcs10,der_pkcs10Size);
closefile(tempfile);
#4
example
var p:pchar;
f:file ;
len:integer;
begin
p:='12345';
assignfile(f,'c:\test.dat');
rewrite(f,1);
blockwrite(f,p^,strlen(p));
closefile(f);
assignfile(f,'c:\test.dat');
reset(f,1);
len:=filesize(f);
p:=StrAlloc(len+1);
blockread(f,p^,len);
p[len]:=#0;
closefile(f);
strdispose(p);
end;
//p^=p[0]
var p:pchar;
f:file ;
len:integer;
begin
p:='12345';
assignfile(f,'c:\test.dat');
rewrite(f,1);
blockwrite(f,p^,strlen(p));
closefile(f);
assignfile(f,'c:\test.dat');
reset(f,1);
len:=filesize(f);
p:=StrAlloc(len+1);
blockread(f,p^,len);
p[len]:=#0;
closefile(f);
strdispose(p);
end;
//p^=p[0]
#5
谢谢zjqyb,你的两个回复都是说读取文件,但是第一个里面提到的“把 der_pkcs10Size^ 改成 der_pkcs10Size[0]”是说写文件时要改的吗?der_pkcs10Size是PInteger,但是der_pkcs10Size[0]是char类型的,编译器还是会说类型不匹配啊
#6
OK,使用zjqyb给的example已经可以成功读写二进制文件,谢谢你的帮助。不过我对你的第一个回复仍不理解,“把 der_pkcs10Size^ 改成 der_pkcs10Size[0]”是什么意思?还有strnew函数只能带一个参数啊!!
#7
在结帖前能否再解释一下?
^_^
^_^
#8
der_pkcs10Size^ =der_pkcs10Size[0]
#9
哦^_^