我想创建一个将文件内容保存到字符串中的函数。我为此使用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()的影响?