Trường Đại học Điện lực Tập đoàn Điện lực Việt Nam



tải về 1.67 Mb.
trang42/48
Chuyển đổi dữ liệu18.07.2016
Kích1.67 Mb.
#1821
1   ...   38   39   40   41   42   43   44   45   ...   48

7.5.9. Tệp văn bản


7.5.9.1. Ý nghĩa

Tệp văn bản là một kiểu tệp phổ biến, đã được định nghĩa sẵn, để lưu trữ xử lý các "văn bản". Khái niệm “văn bản” ở đây khác với khái niệm văn bản thông thường trong các phần mềm xử lý văn bản. “Văn bản” ở đây chỉ gồm các kí tự ASCII và được phân thành các dòng. Ngoài ra, không có bất cứ định dạng nào khác về trình bày như cỡ chữ, kiểu chữ, màu sắc, v.v.


7.5.9.2. Cú pháp

Để khai báo F là biến tệp văn bản ta viết :



Var F: Text;

Ví dụ 7.71: VAR F1, F2 : Text ;

7.5.9.3. Cấu trúc

Thành phần chính của tệp văn bản là các kí tự ASCII. Tuy nhiên, tệp văn bản được chia thành các dòng. Đánh dấu hết dòng bằng dấu Eoln (end of line). Đó là cặp kí tự CR (cariage return) - nhảy về đầu dòng, mã ASCII là 13 - và LF (line feed) - nhảy xuống dòng dưới, mã ASCII là 10.

Dấu hết tệp Eof đối với tệp văn bản là Ctrl-Z có mã ASCII là 26.

Trong môi trường DOS có thể dùng lệnh Type để hiển thị nội dung của tệp văn bản lên màn hình.

Tệp văn bản không phải là tệp các kí tự File of Char. File of Char khác với tệp kiểu Text ở chỗ nó không nhận biết cặp kí tự CR, LF như dấu hết dòng mà coi như hai kí tự ASCII bình thường.

Ví dụ 7.72: đoạn văn bản sau :

Nguyen Thanh Lam

08-08-2002

Het


được chứa trong tệp văn bản thành một dãy :

Nguyen Thanh Lam

CR LF

08-08-2002

CR LF

Het

Eof

Các thủ tục Assign, Rewrite, Reset, Write, Read, Close, Erase, Rename đều dùng được cho tệp văn bản. Ngoài ra còn có thêm thủ tục Append(biếntệp) dùng để mở tệp văn bản và cho phép ghi thêm dữ liệu vào cuối tệp.

Đối với tệp văn bản, không thể đồng thời vừa ghi vừa đọc dữ liệu như tệp có định kiểu.

Để ghi dữ liệu, trước tiên phải khởi tạo tệp bằng lệnh Rewrite hay mở tệp và đưa trỏ về cuối tệp bằng lệnh Append. Sau đó ghi dữ liệu vào tệp bằng thủ tục Write hay Writeln.

Để đọc dữ liệu một tệp đã có, trước tiên ta phải mở tệp bằng lệnh Reset. Sau đó đọc dữ liệu bằng thủ tục Read hay Readln.

Nếu mở tệp bằng Rewrite hoặc Append thì không thể đọc được bằng ReadReadln. Nếu mở tệp bằng Reset thì không thể ghi được bằng Write hay Writeln.


7.5.9.4. Ghi dữ liệu vào tệp văn bản

Có thể ghi các giá trị kiểu nguyên, thực, logic, xâu kí tự ra tệp văn bản bằng các lệnh Write. Các thủ tục Write viết ra tệp văn bản sẽ tự động tính các biểu thức và chuyển đổi các giá trị sang dạng biểu diễn xâu kí tự thông thường để có thể ghi vào tệp văn bản.



Write ( biến tệp , biểu thức 1, biểu thức 2 , ... , biểu thức n ) ;

Writeln ( biến tệp , biểu thức 1, biểu thức 2 , ... , biểu thức n );

Writeln ( biến tệp );
Sau các biểu thức có thể kèm phần định dạng (quy cách) in ra.

Tác dụng của các câu lệnh trên hoàn toàn tương tự như trong trường hợp xuất ra màn hình đã trình bày ở Chương 3. Chỉ khác là ở đây không phải in ra màn hình mà là viết ra tệp văn bản ứng với biến tệp. Về bản chất, màn hình cũng giống như một tệp văn bản.


Ví dụ 7.73: Write(F, 3, 10:4, ‘a’:2, ‘Text’, 4.5:6:2);

sẽ ghi vào tệp thành dãy như sau ( Dấu ~ hiểu là một ký tự trắng):

3~~10~aText~~4.50

Chương trình dưới đây sẽ tạo tệp văn bản T1.TXT :

Program VIDU_7_73;

Var F: Text;

A : Integer;

B : Real;

Begin

A:=100;


B:=1234.5;

Assign(F, ’T1.TXT’);

Rewrite(F);

Write(F, ‘Ket qua=’ :10, A:5, B:7:2);

Close(F);

End.


Nội dung của tệp T1.TXT là :

~~Ket qua=~~100~123.45

Như vậy, cách ghi dữ liệu vào tệp văn bản hoàn toàn giống như khi in dữ liệu lên màn hình.

Thủ tục WRITELN cũng có công dụng như WRITE, nhưng ghi xong dữ liệu thì đưa con trỏ tệp xuống dòng dưới. Đặc biệt, lệnh Writeln(F); không ghi gì cả, chỉ đưa con trỏ tệp xuống dòng.

Nội dung của các tệp văn bản tạo bằng Pascal hoàn toàn có thể xem được bằng lệnh Type của MSDOS, bằng Norton hay bằng chính Turbo Pascal, ...
7.5.9.5. Đọc dữ liệu của tệp văn bản

Các thủ tục Read quen biết có thể đọc từ tệp văn bản rồi gán cho các biến không những các kí tự mà cả các kiểu dữ liệu khác nữa: số nguyên, thực, logic .... Thủ tục Read sẽ tự động chuyển đổi các xâu kí tự biểu diễn dữ liệu thành giá trị có kiểu tương ứng của biến sẽ được gán

Read ( biến tệp , biến 1 , biến 2 , ... , biến n );

Readln ( biến tệp , biến 1 , biến 2 , ... , biến n ) ;

Readln ( biến tệp );
Tác dụng: hoàn toàn giống như các lệnh đọc dữ liệu từ bàn phím đã quen biết, chỉ khác là ở đây không phải nhập dữ liệu từ bàn phím mà các mục dữ liệu đã viết sẵn trong tệp văn bản ứng với biến tệp.

Tuỳ theo kiểu của biến i mà lệnh Read thực hiện đọc một dãy kí tự từ tệp văn bản, chuyển đổi nó thành một giá trị trực tiếp thuộc kiểu dữ liệu của biến i và gán cho biến này.

Quy định về phân cách các mục dữ liệu kiểu số, kiểu kí tự, kiểu xâu kí tự đã được trình bày chi tiết trong Chương 3.

Chú ý: Các biến1, biến2, ..., biếnN phải có kiểu dữ liệu phù hợp với dữ liệu cần đọc tại vị trí tương ứng trong tệp.

Ví dụ 7.74:

Nếu tệp T1.TXT có nội dung như sau:

~~Ket qua=~~100~123.45

thì để đọc lại các dữ liệu này, ta phải khai báo:

Var St :String[10];

i: Integer ; Z : Real;

Và dùng các lệnh:

Reset(F);

Read(F, St, i, Z);

Giá trị của St, i, Z sẽ là: St=’~~Ket qua=’, i=100, Z=123.45.

Nếu khai báo St có kiểu String[9] thì sẽ bị lỗi vì sau khi đọc xong 9 ký tự đầu, máy sẽ đọc tiếp giá trị =~~100 cho biến nguyên i, nhưng vì giá trị này bắt đầu là dấu = nên không đổi ra số nguyên được.

Thủ tục READLN(biếntệp, biến1, biến2, ..., biếnN ) đọc dữ liệu cho các biến xong sẽ đưa trỏ tệp xuống đầu dòng dưới.

Đặc biệt, lệnh READLN( biếntệp); không đọc gì cả, chỉ đưa con trỏ tệp xuống dòng.

7.5.9.6. Các hàm, thủ tục chuẩn khác cho tệp văn bản


Các thủ tục Seek, FileSize, FilePos không áp dụng được cho tệp văn bản vì tệp văn bản có cấu trúc là dãy các dòng kích thước (độ dài) khác nhau.

Dưới đây là các hàm thủ tục áp dụng cho tệp Text.

- Eof( biến tệp ): boolean ;

Kiểm tra đã ở cuối tệp chưa.

- Eoln ( biến tệp ): boolean ;

Kiểm tra đã ở cuối dòng chưa.

- Append ( biến tệp );

Mở tệp văn bản để viết vào, của sổ tệp đặt tại cuối tệp.

- SeekEoln( biến tệp ): boolean ;

Tương tự như Eoln nhưng trước khi kiểm tra nó nhảy qua các dấu cách và dấu Tab. SeekEoln cho kết quả True nếu trên phần còn lại của dòng, kể từ vị trí hiện tại, không còn mục dữ liệu nào nữa.

- SeekEof( biến tệp ): boolean ;

Tương tự như Eof nhưng trước khi kiểm tra nó nhảy qua các dấu cách, dấu Tab và dấu xuống dòng. SeekEof cho kết quả True nếu từ vị trí hiện tại đến cuối tệp không còn mục dữ liệu nào nữa.



- Flush( biến tệp );

Xả hết nội dung bộ đệm của một tệp kiểu văn bản đang được mở để viết vào.

F là một biến kiểu tệp văn bản Text, được mở bằng Rewrite hoặc Append để viết ra. Khi đó lời gọi Flush sẽ xả hết phần nội dung còn đọng trong bộ đệm, viết nốt ra tệp F. Thủ tục này được dùng để đảm bảo rằng mọi lệnh viết ra tệp F đều được thực hiện trọn vẹn, không bỏ sót dữ liệu.

Flush không có tác dụng nếu tệp F đựơc mở để đọc.

- SetTextBuf( biến tệp, vùng đệm, kích thước );

Gán một vùng đệm I/O cho tệp văn bản. Tham biến Vùng đệm là một vùng trong bộ nhớ dùng làm trung gian, tạm chứa dữ liệu trong các thao tác truy cập đọc ra hoặc viết vào tệp trên ổ đĩa. Tham trị kích thước là tuỳ chọn, có thể không có mặt.

Thủ tục này thường dùng để tăng kích thước vùng đệm nhằm đẩy nhanh tốc độ trao đổi dữ liệu với ổ đĩa. Ta đã biết tốc độ truy cập đĩa chậm hơn nhiều so với truy cập bộ nhớ trong. Nếu có một vùng đệm thì các thao tác xử lý đọc / viết tạm ra đây. Khi đầy vùng đệm mới tiến hành thao tác đọc / viết thực sự ra đĩa, không làm lắt nhắt nhiều lần.



SetTextBuf không nên gọi cho tệp đang mở và đã có thao tác trao đổi dữ liệu. Nó có thể được gọi ngay sau Reset, Rewrite, hay Append. Nếu gọi SetTextBuf cho tệp đang mở thì khi có thao tác I/O , có thể bị mất dữ liệu do kích thước của vùng đệm thay đổi.

Ví dụ 7.75: Minh hoạ cách dùng SetTextBuf

Var F: Text;

Ch: Char;

Bodem: array[1..4095] of Char; { 4K buffer }

begin

{Lấy tên tệp từ tham số dòng lệnh}



Assign(F, ParamStr(1));

{Tăng bộ đệm lớn để đọc nhanh}

SetTextBuf(F, Bodem);

Reset(F);

{Đưa toàn bộ nội dung tệp văn bản ra màn hình}

while not Eof(f) do

begin

Read(F, Ch);



Write(Ch);

end;


end.

Chú ý: Thủ tục Seek và các hàm FileSize, FilePos không dùng cho tệp văn bản.

7.5.9.7. Các tệp văn bản ngầm định

Trong Pascal có hai biến tệp văn bản đã được khai báo sẵn là InputOutput , tức là máy đã ngầm khai báo :

Var Input , Output : Text ;

Input thường là bàn phím còn Output thường là màn hình.

Lệnh Readln(Input, x); được viết tắt thành Readln( x) ;

Lệnh Writeln(Output, x); được viết tắt thành Writeln(x);

Máy in cũng là một tệp văn bản, được ngầm khai báo với tên là LST. Để in các biểu thức bt1, bt2, ..., btN ra máy in, ta phải khai báo sử dụng thư viện chuẩn PRINTER, và dùng lệnh :

Write(LST, bt1, bt2, ... , btN);



Ví dụ 7.76: Cho tệp văn bản tên là T2.TXT và có nội dung là:

dong=6


cot =7

0 8 8 -2 6 11 1

8 0 2 0 7 0 2

8 2 0 11 12 9 3

-2 0 11 0 -7 9 4

6 7 12 -7 0 6 5

11 0 9 9 6 0 6

Hãy đọc tệp này đưa vào một ma trận A và in ma trận A lên màn hình. Số dòng và số cột của ma trận A được ghi ở hai dòng đầu tiên trong tệp T2.TXT.

Program VIDU_7_76;

{ vi du ve File Van ban }

uses crt;

Type MANG = array[1..20,1..20] of integer ;

Var A : MANG;

N, M : integer;

F : Text;

Procedure Nhap;

Var i,j : Byte;

st: string[5];

Begin

Assign(F, 'T2.TXT');



Reset(F);

Readln(F, St, N);

Readln(F, St, M);

For i:=1 to N do

begin

For j:=1 to M do



Read(F, A[i,j]);

Readln(F);

end;

Close(F);



End;

Procedure InMatran;

Var i, j : Integer;

Begin


For i:=1 to N do

begin


for j:=1 to M do

write( A[i,j]:4);

writeln;

end;


End;

BEGIN


Clrscr;

Nhap;


InMatran;

Readln;


END.

Ví dụ 7.77 : Lập bảng lượng giác từ 10 đến 890 và ghi ra tệp BLGIAC.DAT

Program Bang_Luong_Giac;

CONST g='|';

Var F : Text;

k : Integer;

Rad,S,C,T,CT : Real;

{-------------------------------}

Function taobansao(Dong:Char; T:Integer):String;



{Chương trình con này tạo đoạn thẳng bởi các dấu bằng =}

Var j : Integer;

Tam :String[80];

Begin


Tam := ' ';

For j := 1 To T Do

Tam := Tam + Dong;

Replicate := Tam;

End;

{-------------------------------}



BEGIN

Assign(f,'BLGIAC.DAT');

Rewrite(f);

Writeln(f,' * BANG LUONG GIAC *');

Writeln(f);

Writeln(f,taobansao(#61,58));

Writeln(f,g,' DO ',g,' RADIAN ',g,' SIN ',g,' COSIN ',

g,' TAN ',g,' COTANG ',g);

Writeln(f,taobansao(#61,58));{tạo đoạn thẳng}

For k := 1 To 89 Do

Begin

Rad := k * Pi /180;



S := Sin(Rad);

C := Cos(Rad);

T := S/C;

CT := 1/t;

writeln(f,g,k:2,g,Rad:10:8,g,S:10:8,g,C:10:8,g,

T:10:6,g,CT:10:6,g);

End;

Writeln(f,taobansao(#61,58));



Close(f);

END.


{Hãy mở tệp 'BLGIAC.DAT' trong thư mục hiện hành để xem kết quả hoặc để tiện quan sát bạn có thể thêm phần ghi ra màn hình}

Каталог: images
images -> Hướng dẫn sử dụng Dropbox Để sử dụng được Dropbox
images -> BÀi thuyết trình cách xáC ĐỊnh và chế ĐỘ pháp lý CỦa các vùng biển theo công ưỚc của liên hiệp quốc về luật biển năM 19821
images -> Céng hßa x· héi chñ nghÜa viÖt nam Độc lập tự do hạnh phúc
images -> Lúa gạo Việt Nam Giới thiệu
images -> Trung Tâm kt tc-đl-cl
images -> Số: 105/2008/QĐ-ttg CỘng hòa xã HỘi chủ nghĩa việt nam độc lập Tự do Hạnh phúc
images -> ChuyêN ĐỀ ĐẠi số TỔ HỢP, XÁc suất kiến thức cơ bản Đại số tổ hợp
images -> BỘ giáo dục và ĐÀo tạo trưỜng đẠi học luật tp. HỒ chí minh dưƠng kim thế nguyên thủ TỤc phá SẢn các tổ chức tín dụng theo pháp luật việt nam
images -> Review of Condor, Sun Grid Engine and pbs

tải về 1.67 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   38   39   40   41   42   43   44   45   ...   48




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương