Download miễn phí Bài giảng Quản lý tập tin





Thông thường, các tập tin xuất chuẩn được trang bị vùng đệm. Điều này có nghĩa là kết xuất chotập
tin được thu thập trong bộ nhớ và không thật sự hiển thị cho đến khi vùng đệm đầy. Nếu một chương trình bị treo hay kết thúc bất thường, một số ký tự vẫn còn nằm trongvùng đệm. Kết quả là chương trình có vẻ như kết thúc sớm hơn là nó thật sự đã làm. Hàm fflush()sẽ giải quyết vấn đề này. Như tên gọi của nó, nó sẽ làm sạch vùng đệm và chép những gì có trong vùng đệm ra ngoài. Hành động làm sạch tùy theo kiểu tập tin. Một tập tin được mở để đọc sẽ có vùng đệm nhập trống, trong khi một tập tin được mở để ghi thì vùng đệm xuất của nó sẽ được ghi vào tập tin.



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:

hú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.
21.2 Các hàm về tập tin và structure FILE
Một tập tin có thể tham chiếu đến bất cứ cái 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 hay kết thúc bất thường, các tập tin vẫn còn mở.
21.2.1 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ê trong bảng 21.1.
Name Function
fopen() Mở một tập tin
fclose() Đóng một tập tin
fputc() Ghi một ký tự vào một tập tin
fgetc() Đọc một ký tự từ một tập tin
fread() Đọc từ một tập tin vào một vùng đệm
fwrite() Ghi từ một vùng đệm vào tập tin
fseek() Tìm một vị trí nào đó trong tập tin
fprintf() Hoạt động giống như printf(), nhưng trên một tập tin
fscanf() Hoạt động giống như scanf(), nhưng trên một tập tin
feof() Trả về true nếu đã đến cuối tập tin (end-of-file)
ferror() Trả về true nếu xảy ra một lỗi
rewind() Đặt lại con trỏ định vị trí (position locator) bên trong tập tin về đầu tập tin
remove() Xóa một tập tin
fflush() Ghi dữ liệu từ một vùng đệm bên trong vào một tập tin xác định
Bảng 21.1: Các hàm cơ bản về tập tin
Các hàm trên chứa trong tập tin header stdio.h. Tập tin header này phải được bao gồm 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. Tập tin header 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.
21.2.2 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 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ừ studio.h có bao gồm một khai báo structure 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à:
Quản lý tập tin 287
FILE *fp;
Khai báo này cho biết fp là một con trỏ trỏ đến một FILE.
21.3 Các tập tin văn bản
Có nhiều hàm khác nhau để quản lý tập tin văn bản. Chúng ta sẽ thảo luận trong các đoạn bên dưới:
21.3.1 Mở một tập tin văn bản
Hàm fopen() mở một stream để sử dụng và liên kết một tập tin với stream đó. Con trỏ kết hợp với tập
tin được trả về từ hàm fopen(). Trong hầu hết các trường hợp, tập tin đang mở là một tập tin trên đĩa.
Nguyên mẫu của hàm fopen() là:
FILE *fopen(const char *filename, const char *mode);
trong đó filename là một con trỏ trỏ đến chuỗi ký tự chứa một tên tập tin hợp lệ và cũng có thể chứa
cả phần mô tả đường dẫn. Chuỗi được trỏ đến bởi con trỏ mode xác định cách thức tập tin được mở.
Bảng 21.2 liệt kê các chế độ hợp lệ mà một tập tin có thể mở.
Chế độ Ý nghĩa
r Mở một tập tin văn bản để đọc
w Tạo một tập tin văn bản để ghi
a Nối vào một tập tin văn bản
r+ Mở một tập tin văn bản để đọc/ghi
w+ Tạo một tập tin văn bản để đọc/ghi
a+f Nối hay tạo một tập tin văn bản để đọc/ghi
Bảng 21.2: Các chế độ mở tập tin văn bản.
Bảng 21.2 cho thấy các tập tin có thể được mở ở nhiều chế độ khác nhau. Một con trỏ null được trả về
nếu xảy ra lỗi khi hàm fopen() mở tập tin. Lưu ý rằng các chuỗi như “a+f” có thể được biễu diễn như
“af+”.
Nếu phải mở một tập tin xyz để ghi, câu lệnh sẽ là:
FILE *fp;
fp = fopen ("xyz", "w");
Tuy nhiên, một tập tin nói chung được mở bằng cách sử dụng một tập hợp các câu lệnh tương tự như
sau:
FILE *fp;
if ((fp = fopen ("xyz", "w")) == NULL)
{
printf("Cannot open file");
exit (1);
}
Macro NULL được định nghĩa trong stdio.h là ‘\0’. Nếu sử dụng phương pháp trên để mở một tập tin,
thì hàm fopen() sẽ phát hiện ra lỗi nếu có, chẳng hạn như đĩa đang ở chế độ cấm ghi (write-protected)
hay đĩa đầy, trước khi bắt đầu ghi đĩa.
288 Lập trình cơ bản C
Nếu một tập tin được mở để ghi, bất kỳ một tập tin nào có cùng tên và đang mở sẽ bị viết chồng lên.
Vì khi một tập tin được mở ở chế độ ghi, thì một tập tin mới được tạo ra. Nếu muốn nối thêm các mẫu
tin vào tập tin đã có, thì nó phải được mở với chế độ “a”. Nếu một tập tin được mở ở chế độ đọc và nó
không tồn tại, hàm sẽ trả về lỗi. Nếu một tập tin được mở để đọc/ghi, nó sẽ không bị xóa nếu đã tồn
tại. Tuy nhiên, nếu nó không tồn tại, thì nó sẽ được tạo ra.
Theo chuẩn ANSI, tám tập tin có thể được mở tại một thời điểm. Tuy vậy, hầu hết các trình biên dịch
C và môi trường đều cho phép mở nhiều hơn tám tập tin.
21.3.2 Đóng một tập tin văn bản
Vì số lượng tập tin có thể mở tại một thời điểm bị giới hạn, việc đóng một tập tin khi không còn sử
dụng là một điều quan trọng. Thao tác này sẽ giải phóng tài nguyên và làm giảm nguy cơ vượt quá
giới hạn đã định. Đóng một stream cũng sẽ làm sạch và chép vùng đệm kết hợp của nó ra ngoài (một
thao tác quan trọng để tránh mất dữ liệu) khi ghi ra đĩa. Hàm fclose() đóng một stream đã được mở
bằng hàm fopen(). Nó ghi bất kỳ dữ liệu nào còn lại trong vùng đệm của đĩa vào tập tin. Nguyên mẫu
của hàm fclose() là:
int fclose(FILE *fp);
trong đó fp là một con trỏ tập tin. Hàm fclose() trả về 0 nếu đóng thành công. Bất kỳ giá trị trả về nào
khác 0 đều cho thấy có lỗi xảy ra. Hàm fclose() sẽ thất bại nếu đĩa đã sớm được gỡ ra khỏi ổ đĩa hay
đĩa bị đầy.
Một hàm khác dùng để đóng stream là hàm fcloseall(). Hàm này hữu dụng khi phải đóng cùng một lúc
nhiều stream đang mở. Nó sẽ đóng tất cả các stream và trả về số stream đã đóng hay EOF nếu có phát
hiện lỗi. Nó có thể được sử dụng theo cách như sau:
fcl = fcloseall();
if (fcl == EOF)
printf("Error closing files");
else
printf("%d file(s) closed", fcl);
21.3.3 Ghi một ký tự
Streams có thể được ghi vào tập tin theo từng ký tự một hay theo từng chuỗi. Trước hết chúng ta hãy
thảo luận về cách ghi các ký tự vào tập tin. Hàm fputc() được sử dụng để ghi các ký tự vào tập tin đã
được mở trước đó bằng hàm fopen(). Nguyên mẫu của hàm này như sau:
int fputc(int ch, FILE *fp);
trong đó fp là một con trỏ tập tin trả về bởi hàm fopen() và ch là ký tự cần ghi. Mặc dù ch được khai
báo là kiểu int, nhưng nó được hàm fputc() chuyển đổi thành kiểu unsigned char. Hàm fputc() ghi
một ký tự vào stream đã đ
 
Top