GHI VÀO TẬP TIN VĂN BẢN

Một phần của tài liệu dphfffgfgfgf (Trang 54 - 58)

KIỂU DỮ LIỆU Cể CẤU TRÚC: KIỂU TẬP TIN (FILE)

VIII. GHI VÀO TẬP TIN VĂN BẢN

Chúng ta có thể ghi các giá trị kiểu integer, real, boolean, string vào tập tin văn bản bằng lệnh write hoặc writeln. Cách ghi này cho phép chuyển các giá trị bằng số sang dạng kí tự, tức là dưới dạng đọc được một cách tường minh như trên trang giấy viết bình thường, cho phép viết các biểu bảng dữ liệu,… với qui cách mong muốn.

Các cách viết Có 3 dạng viết thủ tục

Write(FileVar, Item1, Item2, … ItemN);

Writeln(FileVar, Item1, Item2, … ItemN);

Writeln(FileVar);

Thủ tục Write(FileVar, Item1, Item2, …, ItemN); sẽ viết các giá trị của các Item1, Item2, …, ItemN, là các biến, các hằng hoặc biểu thức có kiểu đơn giản như Integer, Real, Char, String, Boolean vào biến tập tin FileVar. Các Item1, Item2, …, ItemN không nhất thiết phải là cùng kiểu.

Thí d ụ:

Var

I, J: integer;

X: real;

B: Boolean;

S5: String[5];

Ta có thể viết:

Write(FileVar, ‘Thi du: ‘, I, X, J, S5, 6, X + I);

Trong đó Item là: Xâu kí tự, các biến, hằng, biểu thức

Thủ tục Write để ghi vào tập tin văn bản sẽ không chấp nhận Item là các biến có cấu trúc (Array, Set, Record và File). Ví dụ không thể viết:

Write(FileVar, Nguoi);

Vì Nguoi là biến có cấu trúc. Cách viết này chỉ được chấp nhận khi FileVar không phải là tập tin văn bản mà là tập tin chứa các bản ghi NhanSu như ta đã thấy ở phần trước.

Thủ tục Writeln(FileVar, Item1, Item2, …, ItemN); sẽ thực hiện việc đưa thêm dấu hiệu hết dòng vào tập tin sau khi đã viết hết các giá trị các biến.

Thủ tục Writeln(FileVar); sẽ chỉ thực hiện việc đưa thêm dấu hiệu hết dòng (cặp kí tự điều khiển CR và LF) vào tập tin, tức là đưa dấu cách dòng vào tập tin.

Như vậy thủ tục Writeln(FileVar, Item1, Item2, …, ItemN); có thể được thực hiện bằng nhiều thủ tục Write với Writeln ở cuối cùng như sau (dạng khối lệnh)

BEGIN

END;

Write(FileVar, Item1);

Write(FileVar, Item2);

Write(FileVar, ItemN);

Writeln(FileVar);

Cách viết có qui cách (format): tùy vào từng kiểu dữ liệu mà cách viết có khác nhau đôi chút.

N

ếu VI là kí h i ệu b i ểu thức ng u yên: Write(FileVar, VI);

Sẽ viết vào tập tin FileVar giá trị nguyên VI với đúng số chữ số cần thiết:Write(FileVar, VI:n);

Sẽ bố trí n chỗ cho giá trị nguyên VI và căn lề bên phải

Giả sử VI có giá trị bằng 12345

Write(FileVar, VI, VI); cho ra 1234512345 Write(FileVar, VI:8, VI:8); cho ra ___12345___12345 N

ếu VR là b i ểu t h ức thực: Write(FileVar, VR:n);

Cho ra cách biểu diễn số thực dạng có số mũ E tức là dạng viết khoa học của dấu phẩy động, với n chỗ được căn lề bên phải. Trong cách biểu diễn này các chữ số chiếm chỗ như sau:

#.#######E%##

n-6 4

1 chữ số chữ số với # kí hiệu một chữ số bất kì.

% kí hiệu hoặc dấu + hoặc dấu –

Như vậy số chữ số chiếm từ chữ E trở đi luôn luôn là 4 (kí tự E cùng với hai chữ số nguyên có dấu). Bên cạnh đó là một chỗ cho dấu chấm và một chữ số trước dấu chấm. Tổng số chỗ bắt buộc phải có là 6. Số chỗ còn lại trong qui cách viết này là n-6 được giành cho các chữ số sau dấu chấm, còn gọi là các chữ số có nghĩa.

Thí d ụ: VR := 123.123456;

Write(FileVar, VR:8); cho ra 1.23E+02 Write(FileVar, VR:n:m);

Máy sẽ bố trí n chỗ cho số thực VR trong đó có m chỗ giành cho phần thập phân (m chữ số sau dấu chấm) và căn lề bên phải. Nếu m = 0, máy sẽ chỉ đưa ra phần nguyên của VR.

Thí

du: VR = 123.123456;

Write(FileVar, VR:10:2); cho ra ____123.12 10 chỗ với 2 chỗ thập phân Write(FileVar, VR:15:9); cho ra __123.123456000

N

ẾU VC LÀ MỘT KÍ TỰ (CHAR):

Write(FileVar, VC:n); cho ra giá trị của VC với n chỗ được căn lề bên phải. Nếu n > 1, máy sẽ cho ra thêm n- 1 dấu cách vào trước kí tự VC.

Thí

du: CH := ‘H’;

Write(FileVar, CH:1); cho ra H

Write(FileVar, CH:3); cho ra __H {có 2 dấu cách trước chữ H}

N

ẾU VS LÀ MỘT BIỂU THỨC KÍ TỰ HOẶC M ỘT STRING:

Write(FileVar, VS:n);

Cho ra giá trị của VS với n chỗ được căn lề bên phải. Nếu n < độ dài của String thì máy sẽ cắt bớt các chữ ở cuối String.

Thí d ụ:

Write(FileVar, ‘Hello’:1); cho ra H Write(FileVar, ‘Hello’:3); cho ra Hel Write(FileVar, ‘Hello’:10); cho ra _____Hello Thí d ụ:

Var

Begin

Ketqua: TEXT;

A: integer; B: real; C: String[20]; D: Boolean;

A := 34; B := 3.14; C := ‘ END.’; D := True;

Assign(Ketqua, ‘KETQUA.TXT’);

Write(Ketqua, ‘Ket qua la: ‘);

Write(Ketqua, A:10);

END.

Write(Ketqua, B:10:4);

Writeln(Ketqua, C);

Writeln(‘Dong 2! ‘:10, D);

Close(Ketqua);

Ket qua la 34 4.14 END

Dong 2! TRUE

Chương trình này tạo ra một tập tin văn bản với nội dung (xem hình) Các lệnh write ở trên có thể được ghép lại thành một lệnh duy nhất:

Writeln(Ketqua, ‘Ket qua la : ‘, A:10, B:10:4, C);

Mặc dù A là một số nguyên song thủ tục write sẽ tự chuyển sang dạng kí tự tức là dạng đọc được. Máy sẽ giành cho số A 10 chỗ ký tự, vì A chỉ có hai chữ số nên tám chỗ còn lại là trắng. Tương tự, số B được viết ra trong khuôn khổ 10 chữ số với 4 chữ giành riêng cho phần thập phân.

Còn C bản chất của nó đã là các kí tự nên thủ tục write không phải chuyển đổi nữa. D là kiểu boolean nên nó sẽ in ra các từ TRUE hoặc FALSE tương ứng.

I X ./ ĐỌC DỮ LIỆU TỪ TẬP TIN VĂN BẢN:

Chúng ta có thể đọc không những các kí tự từ tập tin văn bản mà còn có thể đọc lại các số nguyên, số thực, boolean từ tập tin văn bản thông qua các thủ tục:

Read(FileVar, Var1, Var2, …, VarN);

Readln(FileVar, Var1, Var2, …, VarN);

Readln(FileVar);

Trong đó Var1, Var2, … VarN là các biến thuộc kiểu Char, String, Integer, Real, Boolean và muốn đọc cho đúng thì trong tập tin văn bản các kí tự tương ứng từ vị trí đọc (vị trí cửa sổ) cũng phải diễn tả đúng các kiểu dữ liệu cần đọc trên.

Thủ tục Readln(FileVar, Var1, Var2, …, VarN); sẽ đưa cửa số tập tin sang đầu dòng tiếp theo sau khi đã lần lượt đọc các biến tương ứng.

Thủ tục Readln(FileVar) sẽ đưa cửa sổ tập tin sang đầu dòng tiếp theo mà không đọc gì cả.

Hàm chuẩn kiểu Boolean EOLN(F) sẽ phát hiện ra dấu hết dòng EOLN (End Of Line) của tập tin F, tránh sai sót khi đọc quá dòng. Khi EOF=TRUE thì EOLN cũng có giá trị TRUE.

INPUT là tập tin văn bản chuẩn tương ứng với tập tin chứa dữ liệu nguồn vào, được máy đã tự động định nghĩa ngay từ đầu và hiện nay INPUT thường là bàn phím (trước đây nó cũng có thể là máy đọc bìa, đọc băng). INPUT không phải ghi vào vị trí biến tập tin trong thủ tục Read hoặc Readln, nghĩa là:

Read(Var1) được hiểu ngầm là Read(INPUT, Var1);

Readln(Var1) được hiểu ngầm là Readln(INPUT, Var1);

Readln; được hiểu ngầm là Readln(INPUT);

D

ấu h i ệu EOF củ a t ập tin vă n b ản đ ã đư ợ c qui ư ớ c là kí tự số 2 6, được thực hiện bằng CTRL_Z. INPUT có thể đọc liên tục cho đến khi ấn CTRL_Z tạo ra EOF(INPUT)=TRUE

While not EOF(INPUT) do Begin

End; Readln(Var1 …);

Vi

ệc đọc vă n bản có thể t ạm chia làm hai loại:

+ Xử lý văn bản, các kí tự

+ Đọc dữ liệu số nguyên, số thực từ tập tin văn bản.

1./ XỬ LÝ VĂN BẢN:

Ví dụ

Hãy lập một chương trình đếm số chữ trong một tập tin văn bản F Program Dem_chu;

Var

Begin

F: Text;

Ch: Char;

I: integer;

FileName: String[30];

Write(‘ Ten tep: ‘); Readln(Filename);

Assign(F, FileName);

Reset(F);

I := 0; (* Reset bộ đếm *) While not EOF(F) do Begin

While not EOLN(F) do Begin Read(F, Ch);

I := I + 1;

End.

End;

Readln(F);

End;

Writeln(‘ So chu la : ‘, I);

Close(F);

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

Từ dòng 3 trở đi cho đến hết tập tin: chứa dữ liệu với thứ tự: ngày của tháng, nhiệt độ, áp suất, độ ẩm.

Ư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).

PROGRAM DOC_DU_LIEU;

Var

BEGIN

END.

Một phần của tài liệu dphfffgfgfgf (Trang 54 - 58)

Tải bản đầy đủ (DOC)

(60 trang)
w