ошибка чтения блока - PullRequest
       10

ошибка чтения блока

0 голосов
/ 29 февраля 2012

Может кто-нибудь объяснить, почему я нажимаю «Ошибка ввода-вывода 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;

Ответы [ 2 ]

5 голосов
/ 29 февраля 2012

Я думаю, что вы пропустили вопрос, и вы используете Delphi 2009+, а не Delphi 7. Я получил сообщение об ошибке в строке заголовка, пытаясь указать ваш точный код на Delphi 2010 (Unicode Delphi).Когда вы говорите:

var biggerfile: file of Char;

Вы объявляете biggerfile файлом "записей", где каждая запись - Char.На Unicode Delphi это 2 байта.Позже вы просите прочитать SizeOf(BufArray) записей , а не байтов.То есть вы запрашиваете 4096 x 2 = 8192 записей .Но ваш буфер имеет всего 4096 записей, поэтому вы получаете странную ошибку.

Я смог исправить ваш код, просто заменив Char на AnsiChar, так как AnsiCharимеет размер 1, следовательно, SizeOf() равняется Length().

Постоянное исправление должно включать переход от очень старых операций в стиле Паскаля 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;
3 голосов
/ 04 апреля 2013

Привет: у меня была та же проблема, и я просто передал ей первый элемент буфера, который является отправной точкой для блока памяти, вот так:

    AssignFile(BinFile,binFileName);
    reset(BinFile,sizeof(Double));
    Aux:=length(numberArray);
    blockread(BinFile,numberArray[0],Aux, numRead);
    closefile(BinFile);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...