Dữ liệu kiểu tệp: KHÁI NIỆM VÀ SỬ DỤNG (p1) – Blog Tư liệu vui học tập – cùng sẻ chia .

Tệp hay tệp dữ liệu là một tập hợp các dữ liệu có liên quan với nhau và có cùng kiểu được nhóm lại với nhau tạo thành một dãy. Chúng thường được chứa trong một thiết bị nhớ ngoài của máy tính (ví dụ như đĩa mềm, đĩa cứng, băng từ…) với một cái tên nào đó.

haylà một tập hợp các dữ liệu có liên quan với nhau và có cùng kiểu được nhóm lại với nhau tạo thành một dãy. Chúng thường được chứa trong một thiết bị nhớ ngoài của máy tính (ví dụ như đĩa mềm, đĩa cứng, băng từ…) với một cái tên nào đó.

     Tệp dữ liệu với dữ liệu được hiểu theo nghĩa rộng : đó có thể là chương trình, có thể là số liệu, có thể là các dữ liệu khác như kí tự, văn bản…

     Tệp còn có tệp có định kiểu, tệp văn bản và tệp không định kiểu  (sẽ học kĩ ở cuối chương) .

     Để dễ hình dung ra tệp, chúng ta hãy xem tổ chức tủ phiếu của thư viện. Các dữ liệu cho một cuốn sách là tên sách, tên tác giả, giá tiền, số trang, nhà xuất bản…  Các dữ liệu này được nhóm lại với nhau để tạo thành các tờ phiếu, mỗi tờ phiếu đóng vai trò là một phần tử của tệp dưới dạng một Record (bản ghi) . Đây cũng là lý do gắn liền khái niệm cấu trúc dữ liệu Record với cấu trúc File. Các phần tử của tệp (các Record) có cùng một kiểu dữ liệu (Ví dụ các phiếu thư viện đều giống nhau ở chỗ mỗi cái đều có tên sách, tên tác giả, nhà xuất bản…) . Các phiếu này được xếp lại thành một tệp  (phiếu)  và được để vào một ô ngăn kéo nào đó với một cái tên (tên tệp) . Ví dụ ngăn chữ A (tên tệp là A) là tệp các cuốn sách có tên bắt đầu bằng chữ A. Các ngăn kéo lại được chứa trong một cái tủ. Trong máy tính, một đĩa cứng hoặc một một đĩa mềm đóng vai trò là chiếc tủ.

     File còn được gọi là hồ sơ, là tập tin.

     Tệp thường được chứa trong một bộ nhớ ngoài như đĩa cứng, đĩa mềm, băng từ. Điều đó cũng có nghĩa là tệp được lưu trữ để dùng nhiều lần và tồn tại ngay cả khi chương trình kết thúc hoặc mất điện. Khác với các cấu trúc dữ liệu khác mà chúng ta đã học như : mảng, tập hợp, bản ghi, là các cấu trúc dữ liệu được tổ chức trên bộ nhớ trong  (RAM)  của máy tính nên một khi kết thúc chạy chương trình hoặc mất điện thì các dữ liệu này cũng mất luôn. Vì vậy những dữ liệu nào cần lưu trữ (như hồ sơ cán bộ, vật tư hàng hóa của kho, tín hiệu điện…) thì ta bắt buộc phải dùng đến tệp. Bên cạnh đó một số thiết bị ngoại vi như bàn phím, màn hình, máy in được coi như là một tệp (xem phần tệp văn bản ở sau) . Tệp cũng còn có thể tổ chức trong bộ nhớ trong của máy song đó là những tệp tạm thời, trung gian vì chúng không lưu trữ lại được khi dừng chương trình hoặc mất điện.

     Tệp là một kiểu dữ liệu có cấu trúc. Định nghĩa của tệp có phần nào giống mảng ở chỗ chúng đều là tập hợp của các phần tử dữ liệu có cùng kiểu. Song mảng được định nghĩa và khai báo trong chương trình với số phần tử đã xác định còn số phần tử của tệp không được xác định khi định nghĩa.

     Định nghĩa một kiểu tệp T với các phần tử có kiểu là KPT (Kiểu phần tử) được viết trong phần mô tả kiểu với từ khóa  FILE OF  như sau :

                    Type

                       T = File Of  KPT ;  

     Sau đó khai báo một biến tệp (FileVar)  trong phần khai báo biến :  

                    Var

                       Biến_tệp : Kiểu_tệp ;  

      hoặc khai báo trực tiếp một biến tệp với mô tả kiểu :  

                    Var

                       Biến_tệp :  File Of  Kiểu_phần_tử ;  

     Ví dụ:  

                    Type

                       FileInteger = File Of  Integer ;

                       FileReal = File Of  Real ;

                       FileBoolean = File Of  Boolean ;

                       NhanSu = Record

                          Ten : String[ 30 ] ;

                          Tuoi : Byte ;

                          Luong : Real ;

                       End ;

                       FileNhanSu = File Of  NhanSu ;

                    Var                                   (* khai báo các biến tệp *) 

                 F1, F2 : FileInteger ;  (* F1, F2  là hai biến tệp có các phần tử là số nguyên *)

                       F3 : FileReal ;               (* F3 là tệp các số thực *) 

                       FNS : FileNhanSu ;       (* FNS là tệp các bản ghi nhân sự *)

                       F5 : File Of  Char ;

                       F6 : File Of

                       Array[ 1.. 5 ]  Of  Integer ;     

     F6 là biến tệp được khai báo trực tiếp trong phần Var với các phần tử là mảng một chiều, độ dài mảng là 5.

     FileInteger là kiểu tệp có các phần tử là số nguyên.

     FileReal là kiểu tệp có các phần tử là số thực.  

     Kiểu của phần tử của tệp có thể là bất kỳ kiểu dữ liệu nào (kiểu vô hướng, kiểu có cấu trúc như mảng, tập, bản ghi) , trừ kiểu tệp nghĩa là không có kiểu tệp của tệp.

 

CẤU TRÚC VÀ VÀ PHÂN LOẠI TỆP

 

 Các phần tử của một Array hoặc một Record có thể truy nhập được tùy ý (Random Access) thông qua tên biến, chỉ dẫn hoặc tên trường. Các phần tử của tệp không có tên và việc truy nhập không thể tùy tiện được. Các phần tử của tệp được sắp xếp thành một dãy và ở mỗi thời điểm chương trình chỉ có thể truy nhập vào một phần tử của tệp thông qua giá trị của một biến đệm (Tampon Variance). Biến đệm được dùng để đánh dấu vị trí truy nhập hay còn được gọi là cửa sổ (Window) của tệp.

     Có những lệnh sẽ làm dịch chuyển cửa sổ sang vị trí tiếp theo hoặc về vị trí đầu của tệp. Ta có thể hình dung ra tệp như là một cuộn phim chụp ảnh. Mỗi một ảnh là một phần tử và ống kính là cửa sổ để nhìn vào nên tại mỗi thời điểm chỉ nhần thấy một ảnh. Sau mỗi lần chụp, cửa sổ sẽ nhìn vào ảnh ở vị trí tiếp theo.

     Mỗi tệp đều được kết thúc bằng một dấu hiệu đặc biệt để báo hết tệp, hay gọi là EOF (End Of File). Pascal có một hàm chuẩn (Function) EOF, kiểu Boolean, với tham số là một biến tệp để thử xem cửa sổ đã đặt vào vị trí kết thúc tệp đó chưa. Nếu cửa sổ còn chưa trỏ vào phần tử cuối tệp thì  EOF(F) có giá trị là False.

     Việc phân loại tệp dựa trên việc bố trí các phần tử của tệp trong bộ nhớ ngoài và cách truy nhập vào tệp : tệp truy nhập tuần tự(Sequential Access), tệp truy nhập trực tiếp(Direct Access).

     Thông dụng nhất là tệp có cấu trúc tuần tự : việc đọc một phần tử bất kỳ của tệp bắt buộc phải tuần tự đi qua các phần tử trước đấy. Còn muốn ghi hay thêm một phần tử vào tệp, ta cần phải đặt cửa sổ vào vị trí cuối tệp. Kiểu truy nhập này là đơn giản nhất trong việc xây dựng tệp cũng như xử lý tệp, song nó kém linh hoạt, Bộ nhớ ngoài điển hình tương ứng với cấu trúc này là băng từ.

     Tệp truy nhập trực tiếp (direct access) là tệp có thể đặt cửa sổ vào một phần tử bất kỳ của tệp thông qua chỉ số thứ tự của phần tử trong tệp. Không phải loại bộ nhớ ngoài nào cũng có thể xây dựng tệp truy nhập trực tiếp do cấu tạo bộ nhớ. Ví dụ băng từ là loại chỉ có thể truy nhập tuần tự. Còn đĩa mềm, đĩa cứng là loại bộ nhớ có thể tạo tệp truy nhập trực tiếp do đầu từ ghi đọc có thể được điều khiển đặt vào một chỗ bất kỳ trên đĩa vào mọi thời điểm. Bạn có thể so sánh giữa băng từ ghi nhạc (bắt buộc truy nhập tuần tự) với đĩa hát (có khả năng truy nhập trực tiếp).

     Pascal chuẩn chỉ định nghĩa loại tệp tuần tự và dưới đây nếu không nói rõ tệp loại gì thì ta hiểu đó là tệp tuần tự. Sau đó chúng ta sẽ nghiên cứu thêm về tệp truy nhập trực tiếp, được Turbo Pascal cũng như các ngôn ngữ khác đưa vào dùng nhiều.

MỞ TỆP MỚI ĐỂ LƯU DỮ LIỆU

 

Chương trình chỉ có thể cất dữ liệu vào một tệp sau khi ta làm thủ tục mở tệp . Việc mở tệp có thể ví như muốn cất các phếu thư viện thì đầu tiên phải đóng ô phiếu mới và gắn tên ô phiếu .  

     Để mở tệp để ghi, Turbo Pascal dùng 2 cặp thủ tục đi liền nhau theo thứ tự :  

                    Assign ( Biến_tệp, Tên_tệp ) ;

                    Rewrite ( Biến_tệp ) ;  

     hay bằng tiếng Anh ta có :          

                    Assign ( FileVar, FileName ) ;

                    Rewrite ( FileVar )  

     Ví dụ:  

                    Assign ( F,’nguyento.dat’ );  (* gán tên tệp nguyento.dat cho biến F *)

                    Reset ( F );      

     Tên tệp (FileName) là tên của tệp đặt trong thiết bị nhớ ngoài được đưa vào dưới dạng mộtString. Ta phải đặt tên tệp sao cho nó phản ánh được ý nghĩa hoặc bản chất, nội dung của tệp. Ví dụ biến tệp F chứa các số nguyên tố thì tệp được đặt tên là ‘nguyento.dat’.

     Tên tệp theo quy định chung gồm có hai phần cách nhau bằng dấu chấm (.) . Phần thứ nhất là phần tên riêng, có số chữ nhiều nhất là 8 . Phần tên này thể hiện nội dung của tệp đó . Phần thứ hai là phần mở rộng có nhiều nhất là 3 chữ, thông thường nói lên loại tệp .  

     Ví dụ :

        * . Pas : là tệp chứa chương trình viết bằng Pascal .

        * . Doc : là tệp chứa văn bản, tài liệu .

        * . Txt  : chứa tệp văn bản .

        * . Com và * . Exe : là các tệp chứa chương trình dưới dạng mã mà máy có thể chạy ngay được trên máy tính .

        * . Dat : chứa các dữ liệu cần xử lý ( Data )              

     Sau khi mở tệp xong, tệp sẽ rỗng vì chưa có phần tử nào, cửa sổ tệp sẽ không có giá trị xác định vì nó trỏ vào cuối tệp (EOF). Đồng thời cần lưu ý khi mở tệp nếu trên bộ nhớ ngoài mà đã có sẵn tệp có tên trùng với tên tệp được mở thì tệp cũ sẽ bị xóa đi .  

    GHI CÁC GIÁ TRỊ VÀO TỆP VỚI THỦ TỤC WRITE :  

     Thủ tục WRITE sẽ đặt các giá trị mới vào tệp giống như ta bấm máy chụp ảnh . Mỗi lần chụp xong một ảnh, máy sẽ tự động đưa ống kính sang vị trí tiếp theo .  

    Cách viết :

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

    hay          Write ( Biến_tệp, các giá trị cần đặt vào ) ;

     Trong đó Item1, Item2, . . . ItemN có thể là các hằng, các biến, các biểu thức, tất nhiên các Item phải có giá trị cùng với kiểu phần tử của tệp.

     Hoặc với I, J, K là các biến Integer thì ta hoàn toàn có thể viết :  

                    Write ( F, 3, I + 2 * J, K ) ;  

     Bước cuối cùng của việc đặt dữ liệu vào tệp là đóng tệp lại bằng thủ tục  

                    Close ( Biến_tệp ) ;  

    Ví dụ đối với tệp F1:  Close ( F1 ) ;  

    Ví dụ 1: Sau đây chúng ta viết một thí dụ hoàn chỉnh : tạo một tệp chứa các số nguyên từ 1 đến 100 với tên tệp là ‘Nguyen . dat’ .  

                    Program TAO_TEP_1 ;

                    Var  

                       I : Integer ;

                       F : File Of Integer ;

                    BEGIN

                       Assign ( F, ‘Nguyen.dat’ ) ;

                       Rewrite ( F ) ;

                       For  I :=1 To  100  Do  Write ( F, I ) ;

                       Close ( F ) ;

                    END .  

     Một tệp có thể đựoc dùng làm tham số của chương trình con (Procedure hoặc Function) với lời khai báo bắt buộc phải sau chữ Var tức là tệp được dùng làm tham biến 

     Ví dụ 2 : 

                    Program TAO_TEP_2 ;

                    Type

                       F1 = File Of Integer ;

                       St30 = String [ 30 ] ;

                    Var

                       MyFile : F1 ;

                       FileName : St30 ;

                    (* —————————————————– *)    

                    Procedure TaoFile ( Var F : F1 ; Ten : St30 ) ;

                    Var

                       I : Integer ;

                    Begin

                       Assign ( F, Ten ) ;

                       Rewrite ( F ) ;

                       For  I := 1  To  100  Do  Write ( F, I ) ;

                       Close ( F ) ;

                    End ;

                    (* —————————————————– *)    

                    BEGIN

                       Write (‘ Ten tep : ‘) ;

                       Readln ( FileName ) ;

                       TaoFile ( MyFile, FileName ) ;

                    END .  

     Ví dụ trên còn gài thủ thuật gài tên rtệp vào khi chương trình chạy thông qua một biếnFileName, tương ứng với tham số hình thức là Ten.

Võ Nhật Trường