1

本の長いリスト(1000冊)、isbnなどを読み取るプログラムを作成しようとしていますが、プログラムを実行すると、範囲オーバーランがtxtの形式であることが示されます

1
1234567890
ABC book
peter
20
2
1234567896
...

コードは次のとおりです。

const maxbk=1000;
type bookrecord = record
                    book_no:string;
                    isbn:string;
                    book_name:string;
                    author:string;
                    borrowed:string;
                    end;
var booklist : array[1..maxbk] of bookrecord;totalbook:integer;

procedure readbooklist(var bklist:array of bookrecord;var totalbk:integer);
var f:text;temp:string;code:integer;
begin
  totalbk:=0;
  assign(f,'bklist.txt');
  reset(f);
  while not eof(f) do
  begin
    readln(f,bklist[totalbk+1].book_no);
    readln(f,bklist[totalbk+1].isbn);
    readln(f,bklist[totalbk+1].book_name);
    readln(f,bklist[totalbk+1].author);
    readln(f,bklist[totalbk+1].borrowed);
    totalbk:=totalbk+1;
  end;
  close(f);
  writeln('read file done');
end;

begin
  readbooklist(booklist,totalbook);
end.

誰が問題を解決するのを助けることができますか??

4

1 に答える 1

1

配列パラメータの扱いに問題があると思います。これを試してください(太字で強調表示されているのは、私が追加した変更です):

const maxbk=1000;
type bookrecord = record
                    book_no:string;
                    isbn:string;
                    book_name:string;
                    author:string;
                    borrowed:string;
                    end;

var booklist : array[1..maxbk] of bookrecord; totalbook:integer;

procedure readbooklist(var bklist:array of bookrecord;var totalbk:integer);
var f:text;temp:string;code:integer;
begin
  totalbk:=Low(bklist);
  assign(f,'bklist.txt');
  reset(f);
  while not eof(f) do
  begin
    readln(f,bklist[totalbk].book_no);
    readln(f,bklist[totalbk].isbn);
    readln(f,bklist[totalbk].book_name);
    readln(f,bklist[totalbk].author);
    readln(f,bklist[totalbk].borrowed);
    totalbk:=totalbk+1;
  end;
  totalbk := totalbk - Low(bklist);
  close(f);
  writeln('read file done');
end;

begin
  readbooklist(booklist,totalbook);
end.

また、いくつかの選択スペースは読みやすさに役立ちます (各コンマの後のスペースや代入演算子の前後のスペースなど)。

また、あなたのコード (および私が提供する変更されたコード) は、入力テキスト ファイル内の不完全なレコードをチェックしたり、空白行など (無効なbook_no値など) を適切にチェックしたりしないことに注意してください。入力ファイルの問題に対する回復力を少し高めるコードを追加してみてください。他の人が指摘したように、入力を構造化し、それを読み取るためのより良い方法がおそらくあります。

于 2013-08-06T17:17:24.653 に答える