Khái niệm và phân loại tệp

Một phần của tài liệu Giáo trình Cơ sở lập trình - Phan 2 (Trang 83 - 89)

2. Nhập/xuất dữliệu

5.6.1. Khái niệm và phân loại tệp

Khái niệm tệp (file)’. 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 lưu trữ trong một thiết bị lưu trữ ngồi của máy tính (ví dụ như đĩa mềm, đĩa cứng, băng từ ...) với một tên nào đó. Trong c tệp là một kiểu dữ liệu có cấu trúc và được định nghĩa trong thư viện stdio.h. Ta thấy tệp có phần nào giống với định nghĩa của mảng ở chỗ chúng đều là tập hợp các phần tử dữ liệu có cùng kiểu. Tuy nhiên, giữa chúng có điều khác biệt là 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 đối với tệp thì số phần tử không được xác định khi định nghĩa. Hơn nữa theo định nghĩa thì tệp thường được lưu trong một bộ nhớ ngoài nên chúng vẫn tồn tại ngay cả khi mất điện. Vì vậy tệp có thể được dùng lại nhiều lần. Trong khi các kiểu dữ liệu cấu trúc như mảng, kiểu cấu trúc ... được tổ chức trên bộ nhớ tạm thời RAM của máy tính nên khi kết thúc việc chạy chương trình hoặc mất điện thì các dữ liệu này sẽ mất ln. 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 cập vào một phần tử của tệp thông qua giá trị của một biến đệm. Biến đệm dùng để đánh dấu vị trí truy cập hay cịn gọi là cửa sổ của tệp. Mỗi tệp có một dấu hiệu kết thúc là EOF (end of file).

Như vậy frong c, tệp luôn đi cùng với một bộ nhớ đệm (buffer) - là vùng trung gian để lưu trữ các thơng tin dữ liệu tạm thời trước khi có sự trung chuyển giữa bộ nhớ của máy và tệp dữ liệu. Bộ nhớ đệm này cho

phép thông tin dữ liệu được ghi vào tệp hoặc đọc ra từ tệp một cách nhanh chóng bằng cách ghi hoặc đọc cả một khối dữ liệu lớn.

Phân loại tệp:

Để phân loại tệp có nhiều tiêu chí khác nhau. Tuy nhiên, ở đây ta chỉ trình bày hai cách phân loại tương ứng với hai tiêu chí là cách truy cập và bản chất dữ liệu.

Phân loại theo cách truy cập:

Cách phân loại này dựa vào việc bố trí các phần tử của tệp trong bộ nhớ ngoài. Theo cách phân loại này tệp được chia thành 2 loại là tệp truy cập trực tiếp và tệp truy cập tuần tự.

• Tệp truy cập tuần tự (sequential access): Đối với loại tệp này

nếu muốn đọc một phần tử bất kỳ của tệp ta bắt buộc phải tuần tự đi qua các phần tử đứng trước phần tử đó. Nếu muốn ghi 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, có nghĩa là ta chỉ có thể thêm các phần tử vào cuối tệp. Tệp loại này có ưu điểm là đơn giản trong việc xây dựng và xử lý tệp. Tuy nhiên, nó có nhược điểm là kém linh hoạt. Bộ nhớ ngồi điển hình cho kiểu truy cập này là băng từ.

• Tệp truy cập trực tiếp (direct access): Đối với tệp này ta có thể

đặt cửa sổ tệp vào một phần tử bất kỳ của tệp thông qua chi số thứ tự của phần tử trong tệp. Do vậy loại tệp truy cập theo kiểu này linh hoạt hơn nhưng việc xử lý của nó sẽ phức tạp hơn. Bộ nhớ ngồi điển hình cho kiểu truy cập này là đĩa mềm, đĩa cứng.

Phân loại theo bản chất dữ liệu:

Theo cách phân loại này có hai loại tệp là: Tệp văn bàn và tệp nhị phân

• Tệp văn bản: là tệp mà các phần tử là các ký tự gồm các chữ cái

‘a’.. ‘z’, ‘A’.. ‘Z’, chữ số ‘0’..‘9’, các ký tự đặc biệt ... Các ký tự này được tổ chức thành dòng với ký tự kết thúc dòng là CR (mã ASCII là

13) và LF (mã ASCII là 10) (‘\r’ và ‘\n’). Ký hiệu kết thúc của tệp văn bản là AZ(Ctrl_Z có mã ASCII là 26).

• Tệp nhị phân: là tệp mà các phần tử là được biểu diễn thành các

byte nhị phân như trong bộ nhớ. Tùy thuộc vào kiểu dữ liệu được ghi vào mà các phần tử có biểu diễn tương ứng trong tệp. Ký hiệu hết dịng của tệp nhị phân chi có ký tự LF=‘\n’.

Trong c tương ứng với từng loại tệp có các lệnh xử lý riêng, Tuy nhiên, có những lệnh được dùng chung cho cà hai loại tệp. Vì vậy ta phải chỉ rõ đây là lệnh xử lý tệp văn bàn hay xử lý tệp dữ liệu nhị phân.

Các bước làm việc với tệp:

Khi làm việc với tệp người dùng cần thực hiện qua các bước như sau: Bước 1 : Khai báo biến tệp;

Bước 2: Mở tệp để xử lý; Bước 3: Xử lý tệp; Bước 4: Đóng tệp.

Phần tiếp theo sẽ trình bày cụ thể ba bước 1, 2 và 4. Riêng bước 3 sẽ được trình bày theo từng loại tệp và gắn liền với hàm cần thao tác để xử lý tệp.

Khai báo

Khai báo biến tệp là bước đầu tiên để thao tác và xử lý tệp. Cú pháp của lệnh khai báo biến tệp có dạng:

FILE *f; Trong đó:

- FILE là từ khóa để chỉ cấu trúc dữ liệu tệp và để thiết lập vùng nhớ đệm của tệp.

- f là con trỏ trỏ tới địa chỉ đầu của bộ nhớ đệm. Ta gọi nó là con trỏ cấu trúc tệp hoặc biến tệp.

Lưu ý rằng từ khóa FILE ln phải viết hoa như vậy. Đây là một cấu trúc dữ liệu và trong c tệp stdio.h chứa một mảng mô tả FILE. Mỗi phần tử của màng liên quan đến một tệp cụ thể. Vì vậy muốn truy cập vào một tệp cụ thể ta phải định nghĩa một con trỏ có kiểu trỏ vào biến có kiểu cấu trúc FILE như trên.

Mở tệp

Sau khi đã khai báo biến tệp ta có thể mở tệp để thực hiện các thao tác đọc ghi với nó.

Cú pháp của hàm mở tệp có dạng như sau:

FILE *fopen(const char*ten_tệp, const char*kiểu) Trong đó:

- Tên_tệp: là tên của tệp trong bộ nhớ ngoài dưới dạng là một xâu ký tự.

- Kiểu: là một xâu ký tự quy định cách xử lý đối với tệp được mờ.

Cơng dụng: Hàm này có chức năng mở tệp tương ứng với kiểu xử

lý được lựa chọn. Nếu thành công hàm trả lại giá trị là một con trỏ kiểu FILE ứng với tệp được mở. Nếu có lỗi hàm sẽ trả lại con trỏ NULL.

Khi đó lệnh mở tệp có dạng như sau:

Biến tệp=fopen(const char*ten_tệp, const char*kiểu) Kiểu xử lý tệp là một trong các xâu ký tự trong bảng sau:

Cho tệp văn bản

Kiểu xử lý Ý nghĩa

“r” “rt” Mở tệp văn bản đã tồn tại để đọc “read only”. Nếu tệp không tồn tại sẽ có lồi.

“w” “wt” Mờ tệp văn mới để ghi “writing only”. Neu tệp đã tồn tại thì nó sẽ bị xóa đi và thay vào đó là một tệp mới.

Kiểu xử lý Ý nghĩa

“a” “at” Mở một tệp văn bản đã có để ghi thêm dữ liệu nối vào cuối tệp này. Nếu tệp chưa tồn tại thì một tệp mới được tạo. “r+” “r+t” Mở tệp văn bản đã có cho phép cà đọc lẫn ghi.

“w+” “w+t” Mờ tệp văn bàn mới cho phép cả đọc lẫn ghi. Nếu tệp đã tồn tại thì nó sẽ bị xóa và thay bằng tệp mới.

“a+” “a+t” Mở tệp văn bản đã có hoặc tạo tệp mới để đọc và ghi thêm dữ liệu nối vào cuối tệp.

Cho tệp nhị phân

Kiểu xử lý Ý nghĩa

“rb” Mở tệp nhị phân đã tồn tạo để đọc. Nếu tệp chưa tồn tại sẽ có lỗi.

“wb” Mở tệp nhị phân mới để ghi dữ liệu. Nếu tệp đã tồn tại thì nó sẽ bị xóa và thay thế bằng tệp mới.

“ab” Mở tệp nhị phân đã có để ghi thêm dữ liệu tiếp nối vào cuối tệp. Nếu tệp chưa tồn tại thì một tệp mới sẽ được tạo ra.

“r+b” Mở tệp nhị phân đã có cho phép cà đọc lẫn ghi.

“w+b” Mở một tệp nhị phân mới để ghi và đọc. Nếu tệp đã tồn tại thi nó sẽ bị xóa và thay thế bằng tệp mới.

“a+b” Mở tệp nhị phân đã có và ghi thêm dữ liệu tiếp nối vào cuối tệp. Nếu tệp chưa tồn tại thì một tệp mới sẽ được tạo ra.

Ví dụ 5.6.1:

Lệnh

f=fopen(“BTl.dat”,”w”);

Sẽ mở một tệp văn bản mới để ghi có tên là BT1 .dat Lệnh

f=fopen(“BT2.dat”, “rb”);

Sẽ mở tệp nhị phân BT2.dat để đọc thông tin của tệp này.

Chúng ta có thể định vị tệp trên bộ nhớ bằng cách chỉ rõ đường dẫn đầy đủ của tệp.

Ví dụ 5.6.2:

f=fopen(“C:\\TC\\BTl.dat”,”w”);

Chú ý: Nếu chúng ta không ghi rõ đường dẫn cho tệp thì câu lệnh

chỉ mở được tệp ở cùng thư mục với chương trình đang chạy. Cịn nếu muốn mở được một tệp bất kỳ thì phải chỉ rõ đường dẫn. Trong các kiểu đọc/ghi, để đọc/ghi đúng dữ liệu chúng ta cần làm sạch vùng nhớ đệm trước khi chuyển từ đọc sang ghi và ngược lại bằng cách sử dụng hàm fïlush.

Đóng tệp

Cú pháp của hàm đóng tệp có dạng như sau: int fclose(FILE *f);

Trong đó:

- f: là con frỏ tệp tương ứng với tệp cần đóng.

Cơng dụng: Hàm này dùng để đóng tệp. Nó sẽ thực hiện:

+ Đẩy dữ liệu còn lại frong vùng nhớ đệm lên đĩa nếu đang thực hiện thao tác ghi.

+ Giải phóng biến tệp f để nó có thể dùng cho tệp khác. Nếu thành cơng thì hàm cho giá trị 0, trái lại hàm trả lại giá trị EOF.

Một phần của tài liệu Giáo trình Cơ sở lập trình - Phan 2 (Trang 83 - 89)

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

(114 trang)