jim*_*web 0 delphi delphi-unicode
任何人都可以解释一下为什么我在下面的块读取中遇到'I/O错误998'?
function ReadBiggerFile: string;
var
biggerfile: file of char;
BufArray: array [1 .. 4096] of char; // we will read 4 KB at a time
nrcit, i: integer;
sir, path: string;
begin
path := ExtractFilePath(application.exename);
assignfile(biggerfile, path + 'asd.txt');
reset(biggerfile);
repeat
blockread(biggerfile, BufArray, SizeOf(BufArray), nrcit);
for i := 1 to nrcit do
begin
sir := sir + BufArray[i];
Form4.Memo1.Lines.Add(sir);
end;
until (nrcit = 0);
closefile(biggerfile);
ReadBiggerFile := sir;
end;
Run Code Online (Sandbox Code Playgroud)
我想你错过了标记问题而你正在使用Delphi 2009+,而不是Delphi 7.我在标题栏中遇到了错误,在Delphi 2010上尝试了你的确切代码(unicode Delphi).当你说:
var biggerfile: file of Char;
Run Code Online (Sandbox Code Playgroud)
你宣称它biggerfile是一个"记录"文件,每个记录都是一个Char.在Unicode Delphi上,这是2个字节.您稍后请求读取SizeOf(BufArray) 记录,而不是字节.也就是说,您要求4096 x 2 = 8192 条记录.但是你的缓冲区只有4096条记录,所以你得到一个奇怪的错误.
我能修复只需更换你的代码Char用AnsiChar的,因为AnsiChar有大小的1,因此SizeOf()等号Length().
永久修复应该涉及从非常古老的Pascal式file操作转变为现代的操作TStream.我不确定你想要获得什么,但如果你只是想用字符串获取文件的内容,我可以建议这样的事情:
function ReadBiggerFile: AnsiString;
var
biggerfile: TFileStream;
begin
biggerfile := TFileStream.Create('C:\Users\Cosmin Prund\Downloads\AppWaveInstall201_385.exe', fmOpenRead or fmShareDenyWrite);
try
SetLength(Result, biggerfile.Size);
biggerfile.Read(Result[1], biggerfile.Size);
finally biggerfile.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4145 次 |
| 最近记录: |