Hai bài Pascal này bài 1 để nhập dữ từ bàn phím và ghi vào file kiểu record, bài 2 để đọc dữ liệu từ file kiểu record tạo ra ở bài 1 và ghi vào file khác. Thế nhưng ở bài 2 khi đọc đến bản ghi cuối cùng thì lại bị lỗi không chạy tiếp được. Nguyên do lỗi gì và giải quyết làm sao? Mong mọi người giúp đỡ.

bài 1:

program i;
uses crt;
type st20 = string[20];
     st10 = string[10];
     sinhvien = record
        hoten:st20;
        diem: st10;
        h:st10;
     end;
var f: file of sinhvien;
    sv: sinhvien;
    ten: st20;
    d:byte;
begin
     assign(f,'a.txt');
     rewrite(f);
     for d:=1 to 3 do begin
         readln(sv.hoten);
         readln(sv.diem);
         readln(sv.h);
         write(f,sv)
     end           ;
     close(f);
end.

bài 2:

program i;
uses crt;
type st20 = string[20];
     st10 = string[10];
     sinhvien = record
        hoten:st20;
        diem: st10;
        h:st10;
     end;
var f: file of sinhvien;
    sv: array[1..2] of sinhvien;
    ten: st20;
    d:integer;
begin
     assign(f,'a.txt');
     reset(f);
     d:=1;
     while not eof(f) do begin
         read(f,sv[d])  ;
         inc(d);
         end;
     close(f);
     assign(f,'aa.txt');
     rewrite(f);
     for d:=d downto 1 do begin
         write(f,sv[d]);
     end           ;
     close(f);
end.

 

Bài 1 bạn ghi 3 bản ghi vào file
Bài 2 bạn đọc các bản ghi lưu vào mảng sv, nhưng mảng sv bạn khai báo chỉ chứa được 2 phần tử -> khi d > 2 thì đọc bản ghi từ file vào mảng sv sẽ bị lỗi tràn mảng. Giải pháp là khai báo mảng sv có ít nhất 3 phần tử.

Một lỗi nữa là bạn không thể ghi vào file aa.txt các bản ghi từ sv[d] đến sv[1] (tức là d bản ghi) bởi thực tế bạn chỉ đọc vào d-1 bản ghi từ sv[1] đến sv[d-1]. Như vậy nên sửa lại là ghi vào file aa.txt các bản ghi từ sv[d-1] đến sv[1]