Hướng dẫn cụ thể về cách sử dụng kiểu dữ liệu tệp trong Turbo Pascal

Tệp là một kiểu đọc ghi dữ liệu liệu của Turbo Pascal, nó trái ngược nhiều so với cách nhập/xuất dữ liệu truyền thống, tức là bạn sẽ nhập dữ liệu vào một file và Turbo Pascal sẽ đọc xử lí rồi ghi kết quả ra một tệp khác - cách này giúp bạn xem được input và output khi chương trình kết thúc. Kiểu tệp thì cũng không khó lắm, nhưng còn rất nhiều bạn lúng túng khi gặp kiểu tệp và trong sách giáo khoa thì nó cũng chưa nói cho rõ ràng - chi tiết. Chính vì vậy, hôm nay mình viết bài này nhằm hướng dẫn một cách chi tiết giúp bạn hiểu hơn về tệp. Một số khái niệm đã có trong sgk nên mình cũng không nói rõ nữa nhé.

#Nguyên lí hoạt động

Khi bạn sử dụng kiểu tệp thì bạn cần hai tệp, một tệp để nhập dữ liệu vào (input), sau khi nhập các bạn save lại. Còn tệp kia là để Turbo Pascal ghi kết quả ra (output). Bạn có thể xem được input và output bất kì lúc nào, bạn thể xem trong Turbo Pascal hoặc cũng có thể xem bằng cách mở tệp đó ra với Notepad. 

#Tạo tệp

Bạn cần tạo ra hai tệp cho mỗi bài toán, bạn có thể tạo trực tiếp trong Turbo Pascal theo các bước bên dưới:
1. Khởi động Turbo Pascal
2. Mở một cửa sổ mới 
3. Save As
4. Nhập tên và đuôi của tệp (vd: Input.txt, Output.txt, Songuyento.inp, Songuyento.out ...)
5. Ok
Như vậy là bạn đã tạo được một tệp, hãy tiếp tục tạo thêm một tệp nữa. Có một lưu ý với cách tạo tệp này là tệp sẽ được lưu ở thư mục BIN của Turbo Pascal, khi khai báo đường dẫn của tệp trong chương trình thì bạn cũng chỉ việc viết tên tệp (có cả phần đuôi) ra thôi.

Nếu bạn muốn tạo tệp và cất dữ ở một thư mục khác thuộc ổ đĩa khác, thư mục baitappas thuộc ổ D chẳng hạn. Thì bạn hãy mở Notepad ra, tạo một file, Save as nhưng nhớ chọn vị trí lưu tệp là D:\baitappas\. Còn về phần tên thì như trên.

#Tạo hằng chứa đường dẫn của tệp

Mình khuyên các bạn nên có hai hằng để lưu vị trí của tệp vd:
const fi ='input.dat';
         fo='output.dat';
Lí do là để khi khai báo ở chương trình thì sẽ ngắn gọn hơn, ví dụ
assign(f,fi); tương dương với assign(f,'input.dat');
assign(f,fo); tương đương với assign(f,'output.dat');
Trên là tệp ở trong thư mục Bin nên chỉ cần viết tên, còn nếu ở ổ đĩa khác, ví dụ như ở ổ D thì cách này sẽ hiệu quả hơn
const fi ='D:\baitappas\kieutep\input.dat';
         fo='D:\baitappas\kieutep\output.dat';
Khi viết ở chương trình chính sẽ là
assign(f,fi); tương dương với assign(f,'D:\baitappas\kieutep\input.dat');
assign(f,fo); tương đương với assign(f,'D:\baitappas\kieutep\output.dat');

#Đọc dữ liệu

Đây là phần mấu chốt của kiểu tệp, nếu không hiểu rõ cách đọc thì sẽ không làm được đâu:
1. Để đọc được trên một dòng thì các bạn hãy dùng read(tên biến tệp,danh sách tên biến);
2. Để đọc được trên nhiều dòng thì hãy kết hợp read và readln: các bạn sử dụng read để đọc trên một dòng, sau khi đọc xong một dòng thì sử dụng readln để đọc dòng tiếp theo, bên dưới là ví dụ về việc đọc mảng hai chiều
1 4 2 5 7
1 4 5 6 6
9 5 3 7 3
2 6 7 9 4 
2 6 8 9 2
Chúng ta thấy rằng, mảng hai chiều thì gồm nhiều hàng nên chúng ta phải sử dụng read để đọc trên một hàng rồi lại sử dụng readln để xuống hàng. Trong bài trên cũng không cho biết có bao nhiêu hàng và bao nhiêu cột nên ta phải sử dụng hàm eof(tên biến tệp) - cho giá trị true khi đọc tới cuối file và eoln(tên biến tệp) cho giá trị true nếu đọc tới cuối dòng hiện tại.
while not eof(f) do {điều kiện chưa kết thúc file} begin inc(i); {tăng chỉ số dòng} j:=0; {đưa chỉ số cột về 0} while not eoln(f) do {điều kiện chưa kết thúc dòng} begin inc(j); {Tăng chỉ số cột} read(f,a[i,j]); {đọc phần tử a[i,j]} end; readln(f); {xuống hàng tiếp theo} end;
Thêm một ví dụ khác nữa, lần này sẽ cho số hàng và số cột:
5 5
1 4 2 5 7
1 4 5 6 6
9 5 3 7 3
2 6 7 9 4 
2 6 8 9 2
Bây giờ bạn phải đọc hai chỉ số hàng và cột đầu tiên sau đó chúng ta dùng vòng lặp for do để đọc
readln(f,m,n); {đọc chỉ số hàng và cột}
for i:= 1 to m do {đọc theo từng dòng}
   begin
      for j:= 1 to n do read(f,a[i,j]); {đọc từng phần tử của dòng}
   readln(f); {xuống dòng mới}
   end;
Khi đọc chỉ số hàng và cột ta sử dụng readln vì đọc xong hai chỉ số đó ta còn phải xuống dòng tiếp theo để bắt đầu đọc mảng

#Ghi dữ liệu

Ghi dữ liệu thì cũng giống như đọc dữ liệu
1. Nếu chỉ cần ghi trên một dòng thì bạn dùng write(tên biến tệp, danh sách biến);
2. Nếu cần ghi dữ liệu trên nhiều dòng thì cần dùng write để viết trên một dòng rồi sử dụng writeln để xuống dòng tiếp theo, dưới là ví dụ về ghi mảng hai chiều:
for i:= 1 to n do
   begin
      for j:= 1 to m do write(f,a[i,j],' '); {viết các phần tử trên một hàng} 
   writeln(f); {xuống một hàng mới}
   end;
Mọi thắc mắc xin để lại bình luận ở dưới, mình sẽ giải thích trong 24h, bây giơ khi viết mình cũng rõ là các bạn thấy khó hiểu ở đâu nữa, bài này mới chỉ nói những điều mà sgk chưa nói rõ.

Comments