X: ARRAY[INTEGER] OF INTEGER; Y: ARRAY[REAL] OF INTEGER;
KIỂU DỮ LIỆU CÓ CẤU TRÚC: KIỂU TẬP TIN (FILE)
2./ ĐỌC DỮ LIỆU SỐ NGUYÊN, SỐ THỰC TỪ TẬP TIN VĂN BẢN:
Với các thủ tục
Read(FileVar, Var1, Var2, …, VarN); Readln(FileVar, Var1, Var2, …, VarN);
Trong đó các biến Var1, …, VarN là các biến số nguyên hoặc số thực. Thủ tục Read và Readln sẽ tự động biến đổi một sâu kí tự thích hợp trong tập tin văn bản sang các số nguyên và số thực. Nó sẽ xem xét dấu cách
(space) như là một dấu ngăn cách giữa các số. Ví dụ: một xâu kí tự thích hợp tương ứng với một số nguyên sẽ chỉ có các kí tự là các chữ số ‘0’..’9’ và dấu ‘+’, ‘-‘, không có dấu chấm ‘.’ như số thực, xây chữ đó có thể có thêm dấu chấm hoặc chữ E biểu thị số mũ của số thực trong cách biểu diễn khoa học. Trong ví dụ đã xét ở trên tập tin F có nội dung:
Ket qua la 34 3.1400 END Dong 2! TRUE
Giả sử chúng ta muốn đọc lại các giá trị 34 và 3.14 vào hai biến I (integer) và X (real) của dòng thứ nhất. Vì biết chắc 10 kí tự đầu không phải là kí tự số nên ta phải đọc qua các kí tự đầu dòng tương ứng với một biến St10 có kiểu là String[10]:
Readln(F, St10, I, J);
Với thí dụ trên nếu dùng lệnh Read(F, I, J); thì sẽ vấp phải sai ngay vì các kí tự đầu (cụm từ ‘Ket qua la’) không phải là một xâu kí tự thích hợp cho việc đọc một biến nguyên I. Máy sẽ báo lỗi và chương trình phải dừng lại.
Thủ tục SEEK, hàm FileSize, FilePos không được áp dụng cho tập tin văn bản vì TEXT được tính theo
đơn vị là dòng (kí tự) với độ dài dòng thay đổi, chúng ta không thể tính toán vị trí đặt con trỏ. Tuy nhiên
Turbo Pascal có hai hàm xử lý TEXT có một phần tên là Seek: SeekEoln(FileVar);
Hàm kiểu Boolean, tương tự như hàm Eoln song trước khi thử Eoln nó nhảy qua các dấu cách Space và Tab.
SekkEof(FileVar);
Hàm kiểu Boolean, tương tự như hàm Eof song trước khi thử Eof nó nhảy qua các dấu cách Space, Tab và các dấu cách dòng.
Như vậy, thủ tục Read và Readln đối với tập tin văn bản có thể đọc nhiều kiểu biến khác nhau ghi trong tập tin văn bản (kí tự, xâu kí tự, số nguyên, số thực, logic boolean)
Thí dụ ứ n g dụng:
Giả sử rằng chúng ta cần lưu trữ và xử lý các tham số là nhiệt độ (số nguyên), áp suất (số thực), độ ẩm (số nguyên) của nhiều ngày trong tháng (cần ghi rõ cả ngày). Sau đó các dữ liệu này được xử lý bằng một chương trình độc lập khác. Bạn có thể tạo ra một tập tin văn bản chứa các dữ liệu này với qui định như sau:
Dòng 1 chứa tên và thuyết minh Dòng 2 chứa đường gạch nét cho đẹp
Ưu điểm của việc dùng tập tin văn bản chứa dữ liệu là ta có thể dùng các chương trình soạn thảo văn bản (các Editor như Editor của Turbo Pascal mà bạn dùng để soạn chương trình) và sau đó có thể xem bằng mắt, sửa, cập nhật các dữ liệu một cách dễ dàng. Điều này sẽ không làm được nếu các dữ liệu được tổ chức thành tập tin các Record.
Nhược điểm của phương pháp cắt dữ liệu dưới dạng văn bản là số ô nhớ chiếm nhiều hơn. Thí dụ khi nhiệt độ = 1656, nếu dùng mã integer thì luôn luôn mất 2 byte, nếu dùng mã kí tự thì khi này mất 4 byte chứa các kí tự là các chữ số ‘1’,’6’,’5’,’6’. Song nhược điểm này thì chỉ là phụ. Nói chung khi bạn cần vào dữ liệu để xử lý vẫn nên dùng tập tin văn bản do ưu điểm kể trên. Chắc bạn sẽ thắc mắc thêm: tại sao không đưa dữ liệu vào qua bàn phím lúc chạy chương trình? Nếu làm như vậy bạn sẽ không mất chỗ trên đĩa từ (đó là ưu điểm rất nhỏ) song có hai nhược điểm lớn sau: nếu số liệu gõ vào sai thì bạn không sửa lại được nữa và nếu chương trình có sai sót nào đó thì bạn sẽ phải sửa chương trình và cho chạy lại chương trình với việc nhập dữ liệu mới (qua bàn phím). Điều này thực sự mất nhiều thì giờ nếu số liệu có nhiều.
Sau khi qui định cách viết văn bản chứa dữ liệu, chúng ta phải tuân thủ qui định về dòng để đọc lại dữ liệu khi cần xử lý. Các dữ liệu trong một dòng cách nhau bằng các dấu cách (Space) với số lượng không bị hạn chế, chủ yếu là do cách trình bày. Giả sử tập tin văn bản có tên là THANG10.DAT (nghĩa là tập tin này chứa các dữ liệu của tháng 10) được tạo ra bằng Editor với nội dung như sau:
THOI TIET THANG 10 NAM 2000
1 30 298.5 45
2 35 100.8 24
………
Chương trình dưới đây sẽ đọc lại các dữ liệu của từng ngày để xử lý, với giả thiết 2 dòng đầu (các dòng không chứa số liệu chắc chắn tồn tại nên chương trình sẽ không kiểm tra EOLN trước khi đọc). Sau đó chương trình sẽ lần lượt đọc từng dòng số liệu. Với giả thiết số dòng chứa số liệu cũng không biết trước nên ta dùng vòng While. Sau kh xử lý số liệu, chúng ta có thể thông báo số ngày (tương ứng với số dòng chứa số liệu).