块读错误 [英] block read error

查看:229
本文介绍了块读错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

任何人都可以解释一下我为什么在下面的块中遇到I / O错误998?

 函数ReadBiggerFile:string; 
var
greaterfile:文件的char;
BufArray:char的数组[1 ... 4096] //我们将一次读取4 KB
nrcit,i:integer;
sir,path:string;
begin
path:= ExtractFilePath(application.exename);
assignfile(greaterfile,path +'asd.txt');
重置(更大文件);
重复
blockread(更大的文件,BufArray,SizeOf(BufArray),nrcit);
for i:= 1 to nrcit do
begin
sir:= sir + BufArray [i];
Form4.Memo1.Lines.Add(sir);
结束
until(nrcit = 0);
closefile(greaterfile);
ReadBiggerFile:= sir;
结束


解决方案

我想你错过了标签的问题,重新使用Delphi 2009+,而不是Delphi 7.我在标题栏中收到错误,尝试在Delphi 2010(unicode Delphi)上的确切代码。当你说:

  var greaterfile:Char的文件; 

您正在声明 greaterfile 一个记录文件,其中每个记录是一个 Char 。在Unicode Delphi这是2个字节。您稍后请求阅读 SizeOf(BufArray) 记录,而不是字节。也就是说,您要求4096 x 2 = 8192 记录。但是你的缓冲区只有4096个记录长,所以你会出现一个奇怪的错误。



我可以通过简单地替换 Char with AnsiChar ,因为 AnsiChar 的大小为$ $ c> 1 ,因此 SizeOf()等于 Length() p>

永久修复应该涉及从旧的Pascal风格的文件操作移到现代的 TStream 为基础。我不确定你正在试图获得什么,但是如果你只想获取一个字符串中的文件的内容,我可以建议这样的一个例子:

 函数ReadBiggerFile:AnsiString; 
var
greaterfile:TFileStream;
begin
greaterfile:= TFileStream.Create('C:\Users\Cosmin Prund\Downloads\AppWaveInstall201_385.exe',fmOpenRead或fmShareDenyWrite);
try
SetLength(Result,greaterfile.Size);
greaterfile.Read(Result [1],greaterfile.Size);
finally greaterfile.Free;
结束
结束


Can anybody please explain me why I am hitting 'I/O error 998' in the below block read?

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;

解决方案

I think you miss-tagged the question and you're using Delphi 2009+, not Delphi 7. I got the error in the title bar trying your exact code on Delphi 2010 (unicode Delphi). When you say:

var biggerfile: file of Char;

You're declaring the biggerfile to be a file of "records", where each record is a Char. On Unicode Delphi that's 2 bytes. You later request to read SizeOf(BufArray) records, not bytes. That is, you request to 4096 x 2 = 8192 records. But your buffer is only 4096 records long, so you get a weird error.

I was able to fix your code by simply replacing Char with AnsiChar, since AnsiChar has a size of 1, hence the SizeOf() equals Length().

The permanent fix should involve moving from the very old Pascal-style file operations to something modern, TStream based. I'm not sure exactly what you're trying to obtain, but if you simply want to get the content of the file in a string, may I suggest something like this:

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;

这篇关于块读错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆