我在Visual Basic中使用此代码从文件加载文本。我需要将它翻译成Delphi,但无法弄清楚如何。
Open txtFile.Text For Binary As #1
file = Space(LOF(1))
Get #1, , file
Close #1
如何让这段代码在Delphi中运行?
答案 0 :(得分:6)
VB的LOF()
返回一个表示文件长度的长整数。在这种情况下,它用于分配大小为LOF
个空格的字符串,LOF()
返回txtFile.Text
中的任何文件名的长度(可能是编辑控件)
Delphi不需要这样的技术来简单地将文本文件加载到内存中。如果您只是想将文件内容转换为字符串,那么Delphi中大致相当的代码:
function LoadTextFromFile(const FileName: string): string;
var
SL: TStringList;
begin
Result := '';
SL := TStringList.Create;
try
SL.LoadFromFile(FileName);
Result := SL.Text;
finally
SL.Free;
end;
end;
使用它:
var
MyText: string;
begin
MyText := LoadTextFromFile('C:\Temp\MyFile.txt');
// Do something with text
end;
如果您想要为用户显示文字,则更加容易 - 只需在表单上放置TEdit
,TMemo
和TButton
,然后双击该按钮即可创建OnClick
事件,并使用以下代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.LoadFromFile(Edit1.Text);
end;
对于那里的纯粹主义者来说,这是一个非常接近的 literal :
function GetStringFromFile(const FileName: string): AnsiString;
var
MS: TMemoryStream;
begin
Result := '';
MS := TMemoryStream.Create;
try
MS.LoadFromFile('D:\Temp\TestText.txt');
SetString(Result, PAnsiChar(MS.Memory), MS.Size);
finally
MS.Free;
end;
end;
答案 1 :(得分:3)
如果您的Delphi不太老,您可以这样做:
uses IOUtils;
...
S := TFile.ReadAllText('MyFileName.txt');
当RTL提供已经足够好的东西时,不要发明自己的解决方案!
答案 2 :(得分:1)
您可以使用TFileStream打开TxtFile.text属性中指定的文件 '#1'意味着是文件句柄,但它不需要因为你使用OOP方法。
打开txtFile.Text对于二进制#1意味着打开不在文本模式下的文件(在记事本中打开)btu作为二进制文件,因此没有任何东西可以转换为ascii字符。所有内容都将被读取广告字节而不是字符
LOF(1)似乎返回文件的长度(句柄1),'Space'将生成一个字符串,其空格字符数(#32)与文件长度相同,并将其分配给变量'文件',然后它将关闭文件句柄。
以此为例:
var
FileContents: AnsiString; // Or an 'array of Byte' instead
Stream: TFileStream;
begin
Stream := TFileStream.Create(txtFile.Text, fmOpenRead);
try
SetLength(FileContents, Stream.Size);
if Length(FileContents) > 0 then
Stream.ReadBuffer(Pointer(FileContents)^, Stream.Size);
finally
Stream.Free;
end;
// Use FileContents as needed...
end;
免责声明: