包含BlockRead()的函数无法访问'Result'变量

时间:2019-08-16 15:07:30

标签: file delphi file-read

我想创建一个将文件内容保存到字符串中的函数。我为此使用BlockRead(),但是它给了我一个非常奇怪的行为。

我创建了以下fileToString()函数,该函数实际上仅从文件中读取一个字节,然后尝试返回一个常量“ foo”字符串作为结果。一切都从Button1Click功能和一个选择文件对话框开始,效果很好。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

    private
      selectedFile: string;
      FileIntoString: string;
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
  function fileToString(fileName: String): String;
  var
      aFile   : File;
      oneByte : byte;
  begin
    Result := '';

    if fileName <> '' then begin

      AssignFile(aFile, fileName);
      Reset(aFile);

      BlockRead(aFile, oneByte, 1);    //Brakpoint 1
      Result := 'foo';                 //Brakpoint 2

      Reset(aFile);
      CloseFile(aFile);
    end;
  end;

var
  dlg: TOpenDialog;
begin
//CHOOSE FILE
  selectedFile := '';
  dlg := TOpenDialog.Create(nil);
  try
    dlg.InitialDir := '.\';
    dlg.Filter := 'All files (*.*)|*.*';
    if dlg.Execute(Handle) then
      selectedFile := dlg.FileName;
  finally
    dlg.Free;
  end;

  FileIntoString := fileToString(selectedFile);
end;
end.

执行该操作时,我收到一条错误消息“访问冲突,地址为0xfe317469:读取地址0xfe317465”,应用崩溃。

当我在断点1处暂停程序时,在执行BlockRead()之前,局部变量'Result'的值为''[空字符串,如在函数的开头所分配的那样],而局部变量'fileName'的值为文件路径字符串的值。

执行BlockRead()并在断点2中暂停后,我对本地变量'Result'和'fileName'都获得了'Inaccesible value',并且在执行Result := 'foo';行之后得到了访问冲突。 / p>

为什么我的局部变量会受到BlockRead()的影响?

0 个答案:

没有答案