Lập trình C: Cơ bản về tập tin


Đăng ký nhận thông báo về những video mới nhất

Giới thiệu

Hầu hết các chương trình đều yêu cầu đọc và ghi dữ liệu vào các hệ thống lưu trữ trên đĩa. Các chương trình xử lý văn bản cần lưu các tập tin văn bản, chương trình xử lý bảng tính cần lưu nội dung của các ô, chương trình cơ sỡ dữ liệu cần lưu các mẫu tin. Bài này sẽ khám phá các tiện ích trong C dành cho các thao tác nhập/xuất (I/O) đĩa hệ thống.

Ngôn ngữ C không chứa bất kỳ câu lệnh nhập/xuất nào một cách tường minh. Tất cả các thao tác nhập/xuất đều thực hiện thông qua các hàm thuộc thư viện chuẩn của C. Tiếp cận này làm cho hệ thống quản lý tập tin của C rất mạnh và uyển chuyển. Nhập/xuất trong C là tuyệt vời vì dữ liệu có thể truyền ở dạng nhị phân hay ở dạng văn bản mà con người có thể đọc được. Điều này làm cho việc tạo tập tin để đáp ứng mọi nhu cầu một cách dễ dàng.

Việc hiểu rõ sự khác biệt giữa stream (luồng) và file (tập tin) là rất quan trọng. Hệ thống nhập/xuất của C cung cấp cho người dùng một giao diện độc lập với thiết bị thật sự đang truy cập. Giao diện này không phải là một tập tin thật sự mà là một sự biễu diễn trừu tượng của thiết bị. Giao diện trừu tượng này được gọi là một stream và thiết bị thật sự được gọi là tập tin.

Các luồng tập tin

Hệ thống tập tin của C làm việc được với rất nhiều thiết bị khác nhau bao gồm máy in, ổ đĩa, ổ băng từ và các thiết bị đầu cuối. Mặc dù tất cả các thiết bị đều khác nhau, nhưng hệ thống tập tin có vùng đệm sẽ chuyển mỗi thiết bị về một thiết bị logic gọi là một stream. Vì mọi streams hoạt động tương tự, nên việc quản lý các thiết bị là rất dễ dàng. Có hai loại streams – văn bản (text) và nhị phân (binary).

Stream văn bản

Một stream văn bản là một chuỗi các ký tự. Các streams văn bản có thể được tổ chức thành các dòng, mỗi dòng kết thúc bằng một ký tự sang dòng mới. Tuy nhiên, ký tự sang dòng mới là tùy chọn trong dòng cuối và được quyết định khi cài đặt. Hầu hết các trình biên dịch C không kết thúc stream văn bản với ký tự sang dòng mới. Trong một stream văn bản, có thể xảy ra một vài sự chuyển đổi ký tự khi môi trường yêu cầu. Chẳng hạn như, ký tự sang dòng mới có thể được chuyển thành một cặp ký tự về đầu dòng/nhảy đến dòng kế. Vì vậy, mối quan hệ giữa các ký tự được ghi (hay đọc) và những ký tự ở thiết bị ngoại vi có thể không phải là mối quan hệ một-một. Và cũng vì sự chuyển đổi có thể xảy ra này, số lượng ký tự được ghi (hay đọc) có thể không giống như số lượng ký tự nhìn thấy ở thiết bị ngoại vi.

Stream nhị phân

Một stream nhị phân là một chuỗi các byte với sự tương ứng một-một với thiết bị ngoại vi, nghĩa là, không có sự chuyển đổi ký tự. Cũng vì vậy, số lượng byte đọc (hay ghi) cũng sẽ giống như số lượng byte ở thiết bị ngoại vi. Các stream nhị phân là các chuỗi byte thuần túy, mà không có bất kỳ ký hiệu nào được dùng để chỉ ra điểm kết thúc của tập tin hay kết thúc của record. Kết thúc của tập tin được xác định bằng độ lớn của tập tin.

Các hàm về tập tin và cấu trúc FILE

Một tập tin có thể tham chiếu đến bất cứ điều gì: từ một tập tin trên đĩa đến một thiết bị đầu cuối hay một máy in. Tuy nhiên, tất cả các tập tin đều không có cùng khả năng. Ví dụ như, một tập tin trên đĩa có thể hổ trợ truy cập ngẩu nhiên trong khi một bàn phím thì không. Một tập tin sẽ kết hợp với một stream bằng cách thực hiện thao tác mở. Tương tự, nó sẽ thôi kết hợp với một stream bằng thao tác đóng. Khi một chương trình kết thúc bình thường, tất cả các tập tin đều tự động đóng.
Tuy nhiên, khi một chương trình bị treo hoặc kết thúc bất thường, các tập tin vẫn còn mở.

Các hàm cơ bản về tập tin

Một hệ thống quản lý tập tin theo chuẩn ANSI bao gồm một số hàm liên quan với nhau. Các hàm thông dụng nhất được liệt kê dưới đây:

  1. fopen(): Mở một tập tin
  2. fclose(): Đóng một tập tin
  3. fputc(): Ghi một ký tự vào một tập tin
  4. fgetc(): Đọc một ký tự từ một tập tin
  5. fread(): Đọc từ một tập tin vào một vùng đệm
  6. fwrite(): Ghi từ một vùng đệm vào tập tin
  7. fseek(): Tìm một vị trí nào đó trong tập tin
  8. fprintf(): Hoạt động giống như printf(), nhưng trên một tập tin
  9. fscanf(): Hoạt động giống như scanf(), nhưng trên một tập tin
  10. feof(): Trả về true nếu đã đến cuối tập tin (end-of-file)
  11. ferror(): Trả về true nếu xảy ra một lỗi
  12. rewind(): Đặt lại con trỏ định vị trí (position locator) bên trong tập tin về đầu tập tin
  13. remove(): Xóa một tập tin
  14. fflush(): Ghi dữ liệu từ một vùng đệm bên trong vào một tập tin xác định

Các hàm trên thuộc thư viện <stdio.h>, do vậy thư viện này phải được khai báo vào chương trình có sử dụng các hàm này. Hầu hết các hàm này tương tự như các hàm nhập/xuất từ thiết bị nhập xuất chuẩn. <stdio.h> còn định nghĩa một số macro sử dụng trong quá trình xử lý tập tin.

Ví dụ như, macro EOF được định nghĩa là -1, chứa giá trị trả về khi một hàm cố đọc tiếp khi đã đến cuối tập tin.

Con trỏ tập tin

Một con trỏ tập tin (file pointer) rất cần thiết cho việc đọc và ghi các tập tin. Nó là một con trỏ đến một cấu trúc (structure) chứa thông tin về tập tin. Thông tin bao gồm: tên tập tin, vị trí hiện tại của tập tin, tập tin đang được đọc hay ghi, có bất kỳ lỗi nào xuất hiện hay đã đến cuối tập tin. Người dùng không cần thiết phải biết chi tiết, vì các định nghĩa lấy từ <stdio.h> có bao gồm một khai báo cấu trúc tên là FILE.

Câu lệnh khai báo duy nhất cần thiết cho một con trỏ tập tin là:

FILE *fp;

Khai báo này cho biết fp là một con trỏ trỏ đến một FILE.


Nếu bạn có điều thắc mắc, bạn hãy comment cho V1Study để được giải đáp.
Bài viết này được chia sẻ bởi LongDT. Nếu bạn muốn chia sẻ bài viết, bạn hãy Đăng ký làm thành viên!
« Prev
Next »
Copied !!!