Cách chia sẽ file Pascal

Tệp là một dãy các phần tử cùng kiểu được sắp xếp một cách tuần tự. Tệp dữ liệu được lưu trữ ở bộ nhớ ngoài dưới một tên nào đó.

Tệp tập hợp trong nó một số phần tử dữ liệu có cùng cấu trúc giống như mảng nhưng khác mảng là số phần tử của tệp chưa được xác định.

[qads]

Trong Pascal có 3 loại tệp được sử dụng là:

1. Tệp văn bản:Dùng để lưu trữ dữ liệu dưới dạng các ký tự của bảng mã ASCII, các ký tự này được lưu thành từng dòng, độ dài các dòng có thể khác nhau. Ví dụ 2008 [kiểu word] khi ghi vào tệp văn bản cần 4 Byte [không phải 2 Byte].

2. Tệp có kiểu: Tệp có kiểu là tệp mà các phần tử của nó có cùng độ dài và cùng kiểu dữ liệu.

3. Tệp không kiểu: Tệp không kiểu là một loại tệp không cần quan tâm đến kiểu dữ liệu ghi trên tệp. Dữ liệu ghi vào tệp không cần chuyển đổi.

 Tác dụng lớn nhất của kiểu dữ liệu tệp là ta có thể lưu trữ các dữ liệu nhập vào từ bàn phím và các kết quả xử lý trong bộ nhớ RAM ra tệp để dùng nhiều lần.

* Khai báo:

– Định nghĩa kiểu tệp với từ khóa FILE OF trong phần mô tả kiểu sau từ TYPE, tiếp theo là khai báo biến tệp trong phần khai báo biến.

Ví dụ:

Type Arr = array[1..100] of integer; {dinh nghia mang Arr} TArr = FILE of Arr; {dinh nghia tep TArr co cac phan tu la mang Arr} TStr = FILE of String[50]; {tep TStr co cac phan tu la chuoi co do dai 50 ky tu} SinhVien = Record Msv, Hoten : String[50]; Diem : real; end; TSv = FILE of SinhVien; {tep TSv gom cac phan tu la kieu SinhVien} Var T1 : TArr; T2 : TStr; T3 : TSv;
  • Định nghĩa trực tiếp biến kiểu tệp trong phần khai báo biến
Var T4 : FILE of array[1..100] of real; T5 : FILE of SinhVien;

1. Nhập xuất với tệp văn bản
Truy nhập vào tệp được hiểu là nhập dữ liệu vào tệp, ghi lại dữ liệu trên thiết bị nhớ ngoài, đọc dữ liệu đó ra màn hình hoặc máy in và xử lý nó.

Trước khi thao tác với tệp chúng ta cần sử dụng thủ tục assign[bientep, tentep]. Thủ tục này nhằm mục đích gán một tập tin trên đĩa [tentep] cho Tên biến tệp trong RAM [bientep].

Assign[bientep, tentep]; Rewrite[bientep];

Thủ tục Rewrite tạo một tập tin trên đĩa có tên đã gán cho Tên biến File bằng lệnh gán Assign đồng thời mở tập tin đó ra để truy xuất dữ liệu.Khi mở tập tin bằng lệnh Rewrite nếu trên đĩa đã có tập tin trùng với tên bạn đặt thì tập tin trên đĩa sẽ bị xoá thay vào đó là một tập tin trống mà bạn đã gán tên cho Tên biến File. Nên bạn cần cẩn thận khi mở tập tin bằng lệnh Rewrite.

  • Mở tệp đã có để ghi thêm:
Assign[bientep, tentep]; Append[bientep]; Assign[bientep, tentep]; Reset[bientep];

Chú ý: Khi mở một tập tin bằng lệnh Reset nếu tập tin không có trên đĩa sẽ gây lỗi.

Cuối cùng, ta phải đóng tệp bằng thủ tục:

CLOSE[bientep];

Thủ tục này chuyển nội dung trong bộ nhớ vào tập tin trên đĩa đồng thời đóng tập tin lại giải toả bộ nhớ dành cho biến tập tin. Các tập tin khi đã mở nếu không đóng lại sẽ mất các dữ liệu truy xuất trên Tên biến File.

Việc xuất nhập dữ liệu trên biến File có kiểu chỉ được thực hiện như sau:
– Ðọc dữ liệu từ tập tin dùng thủ tục Readln[bientep,bien];
– Ghi dữ liệu vào đĩa: dùng thủ tục Writeln[bientep,bien];
Ví dụ:

uses crt; var t : Text; str : string; BEGIN clrscr; assign[t, 'inputText.txt']; {gan ten bien tep cho tep} rewrite[t]; {mo tep de ghi du lieu} writeln[t, 'nguyenvanquan']; writeln[t, '7826']; reset[t]; {mo tep de doc du lieu} writeln['Data of file inputText.txt:']; {trong khi con tro tep chua den cuoi tep thi cu doc} while not eof[t] do begin readln[t, str]; writeln[str]; end; append[t]; {mo tep de ghi them du lieu} writeln[t, 'test']; close[t]; reset[t]; writeln; writeln['Data of file inputText.txt after change:']; {trong khi con tro tep chua den cuoi tep thi cu doc} while not eof[t] do begin readln[t, str]; writeln[str]; end; close[t]; {dong tep} readln; END.

2. Tệp có kiểu Như chúng ta đã biết khi nhập xuất file có kiểu text gây ra nhiều khó khăn khi phải ghi dữ liệu như khi đọc, ghi dữ liệu của 1 sinh viên phải làm rất phức tạp. Chúng ta có thể xử lý đơn giản hơn với tệp có kiểu.

Đọc và ghi :

– Ghi lên tệp: Write[bientep,bien1,bien2,…]; với bien1,bien2,…là các biến cùng kiểu với biến tệp. – Đọc tệp: Read[bientep,bien1,bien2,…]; Chú ý:

Khác với tệp văn bản, việc ghi và đọc tệp có kiểu không sử dụng các lệnh Writeln hoặc readln nghĩa là tệp có kiểu không ghi dữ liệu thành các dòng. Các phần tử của tệp có kiểu được ghi liên tục trong các ô nhớ và chỉ có ký hiệu kết thúc tệp EOF. Khi chúng ta đọc hoặc ghi xong một phần tử thì con trỏ tệp sẽ tự động chuyển đến vị trí kế tiếp.

Truy nhập vào phần tử thứ i của tệp: Seek[bientep,i]; i=0,1,2,… Thủ tục seek sẽ định vị con trỏ tại vị trí thứ i của tệp.

Các hàm xử lý tệp:


* Filesize[bientep] cho biết số phần tử có trong tệp
* FilePos[bientep] cho biết vị trí hiện thời của con trỏ tệp
* Eof[Bientep] cho giá trị là True nếu con trỏ tệp ở vị trí cuối tệp, ngược lại cho giá trị False

Ví dụ:

uses crt; Type SinhVien = Record MSv, Hoten : String; Diem : real; end; Var TSv : FILE of SinhVien; sv : SinhVien; i : integer; BEGIN clrscr; assign[TSv, 'SV.dat']; rewrite[TSv]; for i:= 1 to 3 do {ghi du lieu 3 sinh vien vao tep} begin {nhap du lieu} write['Nhap ma sinh vien thu ', i, ' : ']; readln[sv.MSv]; write[' Nhap ten sinh vien: ']; readln[sv.Hoten]; write[' Nhap diem cua sinh vien: ']; readln[sv.diem]; {ghi du lieu vao tep} write[TSv, sv]; end; close[TSv]; reset[TSv]; {mo tep de doc} writeln; writeln['Thong tin sinh vien thu 2 trong tep:']; seek[TSv, 2]; read[TSv, sv]; writeln['MSV: ', sv.MSv]; writeln['Ho ten: ', sv.Hoten]; writeln['Diem: ', sv.diem:3:2]; close[TSv]; readln; END.

Khi các bạn mở tệp SV.dat ra thì sẽ không thể thấy thông tin như mong muốn vì nó được ghi dưới dạng nhị phân chứ không phải text nhưng thông tin của nó chứ thì vẫn chính xác.

Bài viết có tham khảo tại:
codepascal.blogspot.com
z15.invisionfree.com

Trong các kỳ thi học sinh giỏi tin học và các giải lập trình thi đấu, Free Pascal vẫn là một trong ngôn ngữ chính thức và đôi khi là ngôn ngữ bắt buộc trong các kỳ thi ở cấp nhỏ [THCS]. Bài viết này hướng dẫn cách nhập/xuất dữ liệu với Free Pascal trong các kỳ thi, cũng như trong quá trình làm bài tập hàng ngày của mọi người.

Có hai hình thức nhập xuất dữ liệu chính thường được yêu cầu trong các kỳ thi, bao gồm:

  • Nhập [đọc] dữ liệu từ stdin [mặc đình là bàn phím] và xuất [ghi] dữ liệu ra stdout [mặc định là màn hình]
  • Đọc/ghi dữ liệu từ tập tin văn bản [text file]

Nhập [đọc] dữ liệu từ bàn phím

Đây là chế độ nhập dữ liệu trong hầu hết các hệ thống chấm bài online. Việc nhập dữ liệu được thực hiện bởi hai thủ tục read và readln. Khi chạy trên máy tính cá nhân, gặp câu lệnh nhập dữ liệu này, chương trình sẽ dừng lại để ta nhập dữ liệu vào từ bàn phím, bấm Enter để kết thúc một thao tác nhập liệu.

Thông tin thêm: trong chế độ chấm, hệ thống chấm bài sẽ không hoạt động như vậy, nó sẽ chuyển hướng stdin để lấy dữ liệu từ file chứa dữ liệu test thay vì dừng lại chờ nhập dữ liệu bằng tay.

  • Thủ tục read[danh_sách_biến]; và readln[danh_sách_biến]; đều nhập giá trị ngăn cách nhau với một hoặc nhiểu khoảng trống và gán lần lượt cho các biến trong danh_sách_biến.
  • Điểm khác nhau giữa Thủ tục read và readln là sau khi thực hiện việc nhập liệu, lệnh readln sẽ chuyển xuống dòng dưới, bỏ qua các giá trị còn lại trên dòng hiện tại, lệnh read thì không.
  • Trong cả hai trường hợp dùng read hoặc readln, nếu dòng hiện tại không đủ dữ liệu để gán cho danh_sách_biến, chúng sẽ tiến hành đọc tiếp ở các dòng tiếp theo.

Xét ví dụ sau:

Nếu nhập vào dữ liệu như sau:

Thì kết quả sẽ được a = 1, b = 2 và c = 4 [giá trị 3 bị bỏ qua bởi thủ tục readln đầu tiên.

Nếu nhập vào dữ liệu như sau:

Thì kết quả sẽ được a = 1, b = 2 và c = 3[thủ tục readln đầu tiên đọc dữ liệu trên cả hai dòng đầu, do dòng đầu tiên không đủ dữ liệu].

Nhập dữ liệu dạng xâu ký tự [string]

Đối với biến kiểu xâu ký tự, lệnh read và readln luôn đọc cả dòng dữ liệu và gán cho xâu [không tách theo khoảng trống như ví dụ trên].

Xét ví dụ sau:

Với nhập vào dữ liệu như sau:

Xâu s sẽ được gán giá trị cả dòng dữ liệu này: s = 'Hello Pascal from Thuc'.

Nếu nhập hai xâu trên một dòng, xâu thứ nhất sẽ chứa toàn bộ dòng, xâu thứ hai sẽ rỗng.

Với nhập vào dữ liệu như sau:

Xâu s sẽ được gán giá trị cả dòng dữ liệu này: s = 'Hello Pascal from Thuc', s2 = '', chương trình sẽ in ra:

Lưu ý: Kiểu dữ liệu string trong Free Pascal mặc định là ShortString, với độ dài tối đa là 255 ký tự. Với ví dụ trên, nếu dòng nhập vào có nhiều hơn 255 ký tự thì 255 ký tự đầu sẽ được gán cho s1, phần còn lại sẽ được gán cho s2 [cũng tối đa 255 ký tự]. Để nhập vào xâu ký tự dài hơn 255 ký tự, ta cần sử dụng kiểu dữ liệu AnsiString thay vì String mặc định.

Xuất [ghi] dữ liệu ra màn hình

Tương tự, đây là chế độ xuất dữ liệu trong hầu hết các hệ thống chấm bài online. Việc nhập dữ liệu được thực hiện bởi hai thủ tục write và writeln.

  • Thủ tục write[danh_sách_giá_trị]; và writeln[danh_sách_giá_trị]; đều xuất [ghi, in] các giá trị trong danh_sách_giá_trị, không có khoảng trống ở giữa. Ở đây, danh_sách_giá_trị có thể là danh sách các hằng, các biến, các biểu thức hoặc hỗn hợp giữa chúng.
  • Điểm khác nhau giữa Thủ tục write và writeln là sau khi thực hiện việc xuất dữ liệu, lệnh writeln sẽ viết thêm một dấu xuống dòng để chuyển xuống dòng dưới [các lệnh xuất dữ liệu tiếp theo sẽ ghi từ dòng bên dưới dòng hiện tại]. Còn với lệnh write thì các lệnh xuất dữ liệu tiếp theo sẽ ghi dữ liệu tiếp vào cuối dòng hiện tại.

Xét chương trình sau:

Kết quả thực thi chương trình trên sẽ như sau:

Nhập/xuất dữ liệu từ file văn bản

Đây là chế độ nhập dữ liệu thường gặp trong các kỳ thi học sinh giỏi trong chương trình phổ thông, trong đó dữ liệu nhập vào được ghi sẵn trong một file văn bản [text file], các file này có thể được soạn thảo bằng các ứng dụng soạn thảo văn bản như Notepad, Notepad++, và thường có phần mở rộng là .txt, hoặc cũng có thể soạn sảo trực tiếp bằng Free Pascal IDE.

Trong quá trình học và thực hành, hình thức nhập dữ liệu từ file văn bản cũng thường được dùng để tránh việc phải nhập đi nhập lại các dữ liệu đầu vào khi phải chạy thử chương trình nhiều lần lúc lập trình, nhất là với những bài có dữ liệu vào nhiều và phức tạp.

Trước khi làm việc với file, cần đảm bảo chắc chắn bạn nắm rõ mình đang làm việc ở thư mục nào, file dữ liệu được đọc/ghi sẽ nằm ở đâu trên ổ đĩa cứng và file chương trình [.pas] sẽ nằm ở đâu. [Xem phần Chuyển thư mục làm việc trong Free Pascal bên dưới]

Các bước để nhập/xuất dữ liệu từ file văn bản như sau:

1. Khai báo biến file có kiểu là text, thông thường ta sẽ cần hai biến, một biến cho file input [để nhập dữ liệu] và một biến cho file output [để xuất dữ liệu]

2. Gán biến file cho một đường dẫn đến file sẽ đọc/ghi với lệnh assign. Nếu đường dẫn chỉ gồm tên file thì file này sẽ nắm trong thư mục hiện hành [Xem phần Chuyển thư mục làm việc trong Free Pascal bên dưới].

3. Mở file để đọc với lệnh reset, hoặc mở file để ghi với lệnh rewrite:

4. Tiến hành đọc/ghi với lệnh read/readln và write/writeln giống như ở trên, chỉ thêm tham số đầu tiên là tên biến file cần đọc/ghi

Lưu ý:

  • Khi đọc từ file, file cần phải tồn tại nếu không sẽ báo lỗi.
  • Khi ghi file, file trùng tên nếu đã tồn tại sẽ bị ghi đè.

5. Đóng file sau khi đọc/ghi. Thao tác này hết sức quan trọng nhưng lại hay bị quên. Việc quên đóng file sau khi ghi có thể dẫn đến việc dữ liệu file bị thiếu. Để đóng file, ta dùng lệnh close:

Toàn bộ chương trình như sau:

Để chạy chương trình, ta tạo file input.txt ở cạnh file chương trình [.pas] bằng Notepad và gõ vào hai số nguyên nào đó, rồi ghi file lại. Chạy chương trình bằng tổ hợp phím Ctrl+F9, ta sẽ thấy file output.txt được tạo ra, mở file này ta sẽ thấy kết quả mà chương trình ghi ra.

File chương trình, file input và file output

Nội dung file input.txt:

Nội dung file output.txtsau khi chạy chương trình:

Nếu quen thuộc với Free Pascal IDE, các bạn có thể làm soạn thảo trực tiếp file input và xem file output ngay bên trong Free Pascal:

Chuyển thư mục làm việc trong Free Pascal

Khi làm việc với file, và cả khi lưu lại chương trình của mình, các bạn cần nắm rất rõ ta đang làm việc tại thư mục nào của ổ đĩa cứng, và sẽ lưu file chương trình, đọc file input và ghi file output ở thư mục nào.

Vì vậy ngay khi bắt đầu làm việc với Free Pascal, hãy kiểm tra chắc chắn bạn đang làm việc tại thư mục mong muốn. Để xem và chuyển thư mục làm việc, ta vào menu File, chọn Change Dir...

Tại cửa sổ Change Directory được mở ra, hãy chọn đến thư mục mong muốn, và bấm chọn Chdir, sau đó bấm ok.

Thủ thuật chuyển đổi linh hoạt giữa nhập xuất dữ liệu từ bàn phím/màn hình và file văn bản

Trong một số trường hợp chúng ta cần chuyển đổi qua lại giữa việc nhập xuất dữ liệu từ bàn phím/màn hình qua dạng nhập xuất từ file. Một ví dụ điển hình là khi chạy thử nghiệm ở máy tính cá nhân, thông thường ta dùng file để tránh việc nhập đi nhập lại dữ liệu đầu vào qua các lần chạy, còn khi nộp bài lên các hệ thống chấm tự động ta lại phải chuyển về nhập xuất từ stdin và stdout.

Xem lại các bước ở trên, ngoài các bước chuẩn bị, mở file và đóng file, thì điểm khác biệt chính ở hai cách nhập xuất này là tham số đầu tiên của các thủ tục read, readln, write, writeln là tên biến file.

Như vậy khi chuyển từ dạng nhập/xuất bình thường qua nhập/xuất từ file, ta cần thêm tham số tên biến file cho tất cả các lệnh read/write. Ngược lại, khi chuyển từ dạng nhập/xuất từ file qua nhập/xuất từ bàn phím/màn hình, ta lại phải xoá tham số này ở tất cả các lệnh read/write.

Để tránh việc chuyển qua chuyển lại này, chúng ta có thể dẫn hướng stdin và stdout sang file thay vì nhập/xuất từ bàn phím/màn hình bằng cách ghi đè biến input và output sẵn có của Pascal như sau:

Lưu ý là khi dẫn hướng lại stdin và stdout như trên, các lệnh read, write không cần thay đổi nữa [không cần thêm tên biến file vào tham số đầu tiên].

Như vậy, khi muốn chuyển quan chuyển lại giữa 2 kiểu nhập/xuất dữ liệu, ta chỉ cần thêm hoặc xoá [hoặc chuyển thành chú thích] 4 dòng bôi đậm ở trên và không cần sửa đổi gì thêm.

Cụ thể, khi muốn xuất nhập từ bàn phìm/màn hình:

Và khi muốn xuất/nhập từ file:

Chúc các bạn thành công.

Video liên quan

Chủ Đề