delphi delphi-unicode

delphi - error de lectura de bloque



delphi-unicode (2)

¿Alguien puede explicarme por qué estoy golpeando el ''error de E / S 998'' en la lectura de bloque siguiente?

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;


Creo que echaste de menos la pregunta y estás usando Delphi 2009+, no Delphi 7. Obtuve el error en la barra de título probando tu código exacto en Delphi 2010 (Delphi unicode). Cuando tu dices:

var biggerfile: file of Char;

Estás declarando que el biggerfile es un archivo de "registros", donde cada registro es un Char . En Unicode Delphi eso es 2 bytes. Más adelante solicita leer SizeOf(BufArray) , no bytes. Es decir, solicita 4096 x 2 = 8192 registros . Pero tu memoria intermedia tiene solo 4096 registros, por lo que obtienes un error extraño.

Pude reparar tu código simplemente reemplazando Char con AnsiChar , ya que AnsiChar tiene un tamaño de 1 , por lo tanto, SizeOf() es igual a Length() .

La solución permanente debería implicar pasar de las antiguas operaciones de file estilo Pascal a algo moderno, basado en TStream . No estoy seguro exactamente de lo que está tratando de obtener, pero si simplemente desea obtener el contenido del archivo en una cadena, le sugiero algo como esto:

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;


Hola: tuve el mismo problema y simplemente le pasé el primer elemento del buffer que es el punto de partida para el bloque de memoria así:

AssignFile(BinFile,binFileName); reset(BinFile,sizeof(Double)); Aux:=length(numberArray); blockread(BinFile,numberArray[0],Aux, numRead); closefile(BinFile);