如何读取一个文件的前四个字节?

时间:2022-09-07 22:44:12
为什么我这样不行?

var
sB: array[0..3] of Byte;

begin
...
FileRead(nFileHandler,sB, sizeof(sB));
...

应该怎么读呢?

16 个解决方案

#1


procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#2


procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#3


什么类型的文件!

#4


procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#5


procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#6


应该先移动文件指针到头部。:)

FileSeek(nFileHandler,0,0);

#7


先移动文件指针到文件头部。:)
FileSeek(nFileHandler,0,0);

#8


换成FileRead(nFileHandler,sB, Length(sB));试试?

#9


我看到有很多个回复,怎么进来一个也看不到。正好是换服务器那天晚上发的,是不是出什么问题了?再了一次:
procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#10


MMD,怎么回事?

#11


to 提问者:
   怎么个不行?
   把这4个字节分别显示一下不就知道了吗

#12


to All:
    我是通过FileRead的返回值来判断的,难道这不可行吗?像这样:

nRet:=FileRead(nFileHandler,sB,sizeof(sB));
if nRet<>sizeof(sB) then ...

我吧sizeof都换成length,这样的判断也通不过。各位能不能帮我试一下?

文件为二进制文件。
谢谢!

#13



另外,其实,每次FileRead的返回值为0,???

文件刚打开,还需要FileSeek(FHandle,0,0);吗?刚刚打开的文件不是缺省就指到了文件的开始吗?

#14


我试了一下,很正常啊。
从原则上来说是一打开就指向文件开始,但是俗话说得好:不怕一万,就怕万一。而且我看了一下HELP,并没有显式的说会指向开头。

附:
procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle,i:integer;
    s:array[0..3] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        i:=FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    if i<>Length(s) then
        ShowMessage('读取出错!共读入'+IntToStr(i)+'字节')
    else
        ShowMessage('读取正常!共读入'+IntToStr(i)+'字节');
end;

#15


谢谢!可以啦,怎么给分?

#16


使用文件流吧. memeystream............

#1


procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#2


procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#3


什么类型的文件!

#4


procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#5


procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#6


应该先移动文件指针到头部。:)

FileSeek(nFileHandler,0,0);

#7


先移动文件指针到文件头部。:)
FileSeek(nFileHandler,0,0);

#8


换成FileRead(nFileHandler,sB, Length(sB));试试?

#9


我看到有很多个回复,怎么进来一个也看不到。正好是换服务器那天晚上发的,是不是出什么问题了?再了一次:
procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle:integer;
    s:array[0..4] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    ...//处理过程
end;

#10


MMD,怎么回事?

#11


to 提问者:
   怎么个不行?
   把这4个字节分别显示一下不就知道了吗

#12


to All:
    我是通过FileRead的返回值来判断的,难道这不可行吗?像这样:

nRet:=FileRead(nFileHandler,sB,sizeof(sB));
if nRet<>sizeof(sB) then ...

我吧sizeof都换成length,这样的判断也通不过。各位能不能帮我试一下?

文件为二进制文件。
谢谢!

#13



另外,其实,每次FileRead的返回值为0,???

文件刚打开,还需要FileSeek(FHandle,0,0);吗?刚刚打开的文件不是缺省就指到了文件的开始吗?

#14


我试了一下,很正常啊。
从原则上来说是一打开就指向文件开始,但是俗话说得好:不怕一万,就怕万一。而且我看了一下HELP,并没有显式的说会指向开头。

附:
procedure TForm1.Button1Click(Sender: TObject);
var
    FHandle,i:integer;
    s:array[0..3] of byte;
begin
    if OpenDialog1.Execute then
    begin
        FHandle:=FileOpen(OpenDialog1.FileName, fmOpenRead);
        FileSeek(FHandle,0,0);
        i:=FileRead(FHandle,s,Length(s));
        FileClose(FHandle);
    end;
    if i<>Length(s) then
        ShowMessage('读取出错!共读入'+IntToStr(i)+'字节')
    else
        ShowMessage('读取正常!共读入'+IntToStr(i)+'字节');
end;

#15


谢谢!可以啦,怎么给分?

#16


使用文件流吧. memeystream............