[读二进文件]使用blockread读出的为空

Radar2006 2008-11-12 07:08:33
procedure TForm1.Button6Click(Sender: TObject);
var
f1: file;
Buf: array[0..127] of Char; //定义缓冲区
begin
AssignFile(f1, fn3);
try
Reset(f1, 1);
BlockRead(f1, Buf, SizeOf(Buf)); //读源文件
ShowMessage(Buf);
finally
CloseFile(f1);
end;
end;

为什么读出的二进制文件总是空呢?
...全文
118 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Radar2006 2008-11-15
  • 打赏
  • 举报
回复
其实主要是vb代码转delphi

我这有个vb写的二进制文件,有vb代码,很短只有几行
现在想用delphi写出一个相同格式的文件来
试验了很久,总是有些错位

哪个位高手能帮帮我?留下email,我可以把文件发过来
另送200


Radar2006 2008-11-15
  • 打赏
  • 举报
回复
是二进制的。文本是没问题
zhao007z4 2008-11-13
  • 打赏
  • 举报
回复
指定下AmtTransferred,
BlockRead(fl,buf,Sizeof(buf),numread);
procedure TForm1.Button1Click(Sender: TObject);
var
fl:file;
f3:string;
buf:array[0..127] of char;
numread: Integer;
begin
if(OpenDialog1.Execute) then
begin
f3:=OpenDialog1.FileName;
end;
AssignFile(fl,f3);
Reset(fl,1);
FillChar(buf,SizeOf(buf),0);
BlockRead(fl,buf,Sizeof(buf),numread);

ShowMessage();
CloseFile(fl);
end;
zhao007z4 2008-11-13
  • 打赏
  • 举报
回复
同意楼上的观点
你的文件可能是UNicode的,这样ShowMessage是不可能正确读出的
jadeluo 2008-11-13
  • 打赏
  • 举报
回复
有可能二进制文件的内容是不能直接ShowMessage出来的内容。
建议LZ先换一个纯文本文件来读一读试试,你最初的代码用来读文本文件是没问题的。
Radar2006 2008-11-12
  • 打赏
  • 举报
回复
使用TFileStream 还是空
Radar2006 2008-11-12
  • 打赏
  • 举报
回复
里面有中文要怎么处理?

如果把edit1换成string变量的话也不行:

for i := 0 to 127 do
Edit1.Text := Edit1.Text + Buf[i];

for i := 0 to 127 do
S:= S + Buf[i]; //零长度空字符


mygodsos 2008-11-12
  • 打赏
  • 举报
回复
试验了楼主的程序,没错呀

var
f1:file;
f3:string;
buf:array[0..127] of Char;
begin
f3:='123.txt';
AssignFile(f1,f3);
Reset(f1,1);
BlockRead(f1,buf,Sizeof(buf));
ShowMessage(buf);
CloseFile(f1);
end;

直接就出来buf的字符。
其实你想按字节来读,可使用TFileStream

var
MyStream:TFileStream;
f3:string;
buf:array[0..127] of Char;
begin
f3:='123.txt';
MyStream:=TFileStream.Create(f3,fmOpenRead);
MyStream.Read(buf,sizeof(buf));
ShowMessage(buf);
MyStream.Free;
end;

Radar2006 2008-11-12
  • 打赏
  • 举报
回复
现在问题转化成 array of char 与string转换上了:
for i := 0 to 127 do
Edit1.Text := Edit1.Text + Buf[i];
这样是能得出正确的字符串

strpas(buf) 不行
move 也不行
SetLength(s, Length(Buf));
Move(Buf, s[1], Length(Buf));

还有简单高效的方法没?
tangyang887 2008-11-12
  • 打赏
  • 举报
回复
up
Radar2006 2008-11-12
  • 打赏
  • 举报
回复

Open strName For Binary As #1
put #1, , 'abcdefg'
Close #1


使用delphi应该怎样读取?
Radar2006 2008-11-12
  • 打赏
  • 举报
回复
var
MS: TMemoryStream;
s: string;
begin
//读任意文件到字符串中
MS := TMemoryStream.Create();
MS.LoadFromFile(fileName);

使用MemoryStream打开时也出错:cannot open file?
Radar2006 2008-11-12
  • 打赏
  • 举报
回复
回jadeluo
fn3 已正确赋值
buf大小远小于文件大小
这些基本的都没问题
jadeluo 2008-11-12
  • 打赏
  • 举报
回复
文件名有没有赋值给fn3?

缓冲区Buf的大小是不是超过了文件大小? 超过了,BlockRead会出错。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧