Ngôn ngữ lập trình C - Chương 9: Tập tin

Tệp tin 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 một kiểu được nhóm lại với nhau 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 (đĩa mềm, đĩa cứng.) dưới một cái tên nào

đó.

Tên tiếng Anh của tệp là file, nó được dùng để chỉ ra một hộp đựng các phiếu

hay thẻ ghi của thư viện. Một hình ảnh rõ nét giúp ta hình dung ra tệp là tủ phiếu của

thư viện. Một hộp có nhiều phiếu giống nhau về hình thức và tổ chức, song lại khác

nhau về nội dung. ở đây, tủ phiếu là tệp, các lá phiếu là các thành phần của tệp. Trong

máy tính, một đĩa cứng hoặc một đĩa mềm đóng vai trò chiếc tủ (để chứa nhiều tệp).

Tệp được chứa trong bộ nhớ ngoài, điều đó 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. Chính vì

lý do trên, chỉ những dữ liệu nào cần lưu trữ ( như hồ sơ chẳng hạn) thì ta nên dùng

đến tệp.

pdf14 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1956 | Lượt tải: 0download
Tóm tắt nội dung Ngôn ngữ lập trình C - Chương 9: Tập tin, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 con trỏ tệp */ 
9.2.2. Mở tệp - hàm fopen : 
Cấu trúc ngữ pháp của hàm : 
 FILE *fopen(const char *tên_tệp, const char *kiểu); 
Nguyên hàm trong : stdio.h . 
Trong đó : 
 Đối thứ nhất là tên tệp, đối thứ hai là kiểu truy nhập. 
Công dụng : 
 Hàm dùng để mở tệp. Nếu thành công hàm cho con trỏ kiểu FILE ứng với tệp 
vừa mở. Các hàm cấp hai sẽ làm việc với tệp thông qua con trỏ này. Nếu có lỗi hàm 
sẽ trả về giá trị NULL. 
Bảng sau chỉ ra các giá trị của kiểu : 
Tên kiểu ý nghĩa 
"r" "rt" Mở một tệp để đọc theo kiểu văn bản. Tệp cần đọc phải đã tồn tại, 
nếu không sẽ có lỗi 
"w" "wt" Mở một tệp để ghi theo kiểu văn bản. Nếu tệp đã tồn tại thì nó sẽ bị 
xoá. 
"a" "at" Mở một tệp để ghi bổ xung theo kiểu văn bản. Nếu tệp chưa tồn tại 
thì tạo tệp mới. 
"rb" Mở một tệp để đọc theo kiểu nhị phân. Tệp cần đọc phải đã tồn tại, 
nếu không sẽ có lỗi. 
"wb" Mở một tệp mới để ghi theo kiểu nhị phân. Nếu tệp đã tồn tại thì nó 
sẽ bị xoá. 
"ab" Mở một tệp để ghi bổ xung theo kiểu nhị phân. Nếu tệp chưa tồn tại 
thì tạo tệp mới. 
"r+" "r+t" Mở một tệp để đọc/ghi theo kiểu văn bản. Tệp cần đọc phải đã tồn 
tại, nếu không sẽ có lỗi 
"w+" Mở một tệp để đọc/ghi theo kiểu văn bản. Nếu tệp đã tồn tại thì nó sẽ 
Chương 9:Tập tin 
118 
"w+t" bị xoá. 
"a+" "a+t" Mở một tệp để đọc/ghi bổ xung theo kiểu văn bản. Nếu tệp chưa tồn 
tại thì tạo tệp mới. 
"r+b" Mở một tệp để đọc/ghi theo kiểu nhị phân. Tệp cần đọc phải đã tồn 
tại, nếu không sẽ có lỗi. 
"w+b" Mở một tệp mới để đọc/ghi theo kiểu nhị phân. Nếu tệp đã tồn tại thì 
nó sẽ bị xoá. 
"a+b" Mở một tệp để đọc/ghi bổ xung theo kiểu nhị phân. Nếu tệp chưa tồn 
tại thì tạo tệp mới. 
Chú ý : 
 Trong các kiểu đọc ghi, ta nên lầm sạch vùng đệm trước khi chuyển từ đọc 
sang ghi hoặc ngược lại. Ta sẽ đề cập đến các hàm với tính năng xoá sau này. 
Ví dụ : 
f=fopen("TEPNP","wb"); 
9.2.3. Đóng tệp - hàm fclose : 
Cấu trúc ngữ pháp của hàm : 
 int fclose(FILE *fp); 
Nguyên hàm trong : stdio.h . 
Trong đó : 
 fp là con trỏ ứng với tệp cần đóng. 
Công dụng : 
 Hàm dùng để đóng tệp khi kết thúc các thao tác trên nó. Khi đóng tệp, máy 
thực hiện các công việc sau : 
 Khi đang ghi dữ liệu thì máy sẽ đẩy dữ liệu còn trong vùng đệm lên đĩa 
 Khi đang đọc dữ liệu thì máy sẽ xoá vùng đệm 
 Giải phóng biến trỏ tệp. 
 Nếu lệnh thành công, hàm sẽ cho giá trị 0, trái lại nó cho hàm EOF. 
Chương 9:Tập tin 
119 
Ví dụ : 
fclose(f); 
9.2.4. Đóng tất cả các tệp đang mở- hàm fcloseall : 
Cấu trúc ngữ pháp của hàm : 
 int fcloseall(void); 
Nguyên hàm trong : stdio.h . 
Công dụng : 
 Hàm dùng để đóng tất cả các tệp đang mở . Nếu lệnh thành công, hàm sẽ cho 
giá trị bằng số là số tệp được đóng, trái lại nó cho hàm EOF. 
Ví dụ : 
fcloseall(); 
9.2.5. Làm sạch vùng đệm - hàm fflush : 
Cấu trúc ngữ pháp của hàm : 
 int fflush(FILE *fp); 
Nguyên hàm trong : stdio.h . 
Công dụng : 
 Dùng làm sạch vùng đệm của tệp fp. Nếu lệnh thành công, hàm sẽ cho giá trị 
0, trái lại nó cho hàm EOF. 
Ví dụ : 
fflush(f); 
9.2.6. Làm sạch vùng đệm của các tệp đang mở - hàm fflushall : 
Cấu trúc ngữ pháp của hàm : 
 int fflushall(void); 
Chương 9:Tập tin 
120 
Nguyên hàm trong : stdio.h . 
Công dụng : 
 Dùng làm sạch vùng đệm của tất cả các tệp đang mở. Nếu lệnh thành công, 
hàm sẽ cho giá trị bằng số các tệp đang mở, trái lại nó cho hàm EOF. 
Ví dụ : 
fflushall(); 
9.2.7. Kiểm tra lỗi file - hàm ferror : 
Cấu trúc ngữ pháp của hàm : 
 int ferror(FILE *fp); 
Nguyên hàm trong : stdio.h . 
Trong đó fp là con trỏ tệp. 
Công dụng : 
 Hàm dùng để kiểm tra lỗi khi thao tác trên tệp fp. Hàm cho giá trị 0 nếu không 
có lỗi, trái lại hàm cho giá trị khác 0. 
9.2.8. Kiểmtra cuối tệp - hàm feof : 
Cấu trúc ngữ pháp của hàm : 
 int feof(FILE *fp); 
Nguyên hàm trong : stdio.h . 
Trong đó fp là con trỏ tệp. 
Công dụng : 
 Hàm dùng để kiểm tra cuối tệp. Hàm cho giá trị khác 0 nếu gặp cuối tệp khi 
đọc, trái lại hàm cho giá trị 0. 
9.2.9. Truy nhập ngẫu nhiên - các hàm di chuyên con trỏ chỉ vị : 
9.2.9.1. Chuyển con trỏ chỉ vị về đầu tệp - Hàm rewind : 
Chương 9:Tập tin 
121 
Cấu trúc ngữ pháp : 
 void rewind(FILE *fp); 
Nguyên hàm trong : stdio.h . 
Trong đó fp là con trỏ tệp. 
Công dụng : 
 Chuyển con trỏ chỉ vị của tệp fp về đầu tệp. Khi đó việc nhập xuất trên tệp fp 
được thực hiện từ đầu. 
Ví dụ : 
rewind(f); 
9.2.9.2. Chuyển con trỏ chỉ vị trí cần thiết - Hàm fseek : 
Cấu trúc ngữ pháp : 
 int fseek(FILE *fp, long sb, int xp); 
Nguyên hàm trong : stdio.h . 
Trong đó 
 fp là con trỏ tệp. 
 sb là số byte cần di chuyển. 
 xp cho biết vị trí xuất phát mà việc dịch chuyển được bắt đầu từ đó. 
 xp có thể nhận các giá trị sau : 
 xp=SEEK_SET hay 0 : Xuất phát từ đầu tệp. 
 xp=SEEK_CUR hay 1: Xuất phát từ vị trí hiện tại của con trỏ chỉ vị. 
 xp=SEEK_END hay 2 : Xuất phát từ cuối tệp. 
Công dụng : 
 Chuyển con trỏ chỉ vị của tệp fp về vị trí xác định bởi xp qua một số byte xác 
định bằng giá trị tuyệt đối của sb. Chiều di chuyển là về cuối tệp nếu sb dương, trái 
Chương 9:Tập tin 
122 
lại nó sẽ di chuyển về đầu tệp. Khi thành công, hàm trả về giá trị 0. Khi có lỗi hàm trả 
về giá trị khác không. 
Chú ý : 
 Không nên dùng fseek trên tệp tin văn bản, do sự chuyển đổi ký tự sẽ làm cho 
việc định vị thiếu chính xác. 
Ví dụ : 
 fseek(stream, SEEK_SET, 0); 
9.2.9.3. Vị trí hiện tại của con trỏ chỉ vị - Hàm ftell : 
Cấu trúc ngữ pháp : 
 int ftell(FILE *fp); 
Nguyên hàm trong : stdio.h . 
Trong đó 
 fp là con trỏ tệp. 
Công dụng : 
 Hàm cho biết vị trí hiện tại của con trỏ chỉ vị (byte thứ mấy trên tệp fp) khi 
thành công. Số thứ tự tính từ 0. Trái lại hàm cho giá trị -1L. 
Ví dụ : 
 Sau lệnh fseek(fp,0,SEEK_END); 
 ftell(fp) cho giá trị 3. 
 Sau lệnh fseek(fp,-1,SEEK_END); 
 ftell(fp) cho giá trị 2. 
9.2.10. Ghi các mẫu tin lên tệp - hàm fwrite : 
Cấu trúc ngữ pháp của hàm : 
 int fwrite(void *ptr, int size, int n, FILE *fp); 
Chương 9:Tập tin 
123 
Nguyên hàm trong : stdio.h . 
Trong đó : 
 ptr là con trỏ trỏ tới vùng nhớ chứa dữ liệu cần ghi. 
 size là kích thước của mẫu tin theo byte 
 n là số mẫu tin cần ghi 
 fp là con trỏ tệp 
Công dụng : 
 Hàm ghi n mẫu tin kích thước size byte từ vùng nhớ ptr lên tệp fp. 
 Hàm sẽ trả về một giá trị bằng số mẫu tin thực sự ghi được. 
Ví dụ : 
#include "stdio.h" 
struct mystruct 
{ 
 int i; 
 char ch; 
}; 
main() 
{ 
 FILE *stream; 
 struct mystruct s; 
 stream = fopen("TEST.TXT", "wb") /* Mở tệp TEST.TXT */ 
 s.i = 0; 
 s.ch = 'A'; 
 fwrite(&s, sizeof(s), 1, stream); /* Viết cấu trúc vào tệp */ 
 fclose(stream); /* Đóng tệp */ 
 return 0; 
} 
9.2.11. Đọc các mẫu tin từ tệp - hàm fread : 
Chương 9:Tập tin 
124 
Cấu trúc ngữ pháp của hàm : 
 int fread(void *ptr, int size, int n, FILE *fp); 
Nguyên hàm trong : stdio.h . 
Trong đó : 
 ptr là con trỏ trỏ tới vùng nhớ chứa dữ liệu cần ghi. 
 size là kích thước của mẫu tin theo byte 
 n là số mẫu tin cần ghi 
 fp là con trỏ tệp 
Công dụng : 
 Hàm đọc n mẫu tin kích thước size byte từ tệp fp lên lên vùng nhớ ptr. 
 Hàm sẽ trả về một giá trị bằng số mẫu tin thực sự đọc được. 
Ví dụ : 
#include "string.h" 
#include "stdio.h" 
main() 
{ 
 FILE *stream; 
 char msg[] = "Kiểm tra"; 
 char buf[20]; 
 stream = fopen("DUMMY.FIL", "w+"); 
 /* Viết vài dữ liệu lên tệp */ 
 fwrite(msg, strlen(msg)+1, 1, stream); 
 /* Tìm điểm đầu của file */ 
 fseek(stream, SEEK_SET, 0); 
 /* Đọc số liệu và hiển thị */ 
 fread(buf, strlen(msg)+1, 1, stream); 
 printf("%s\n", buf); 
 fclose(stream); 
Chương 9:Tập tin 
125 
 return 0; 
} 
9.2.10. Nhập xuất ký tự : 
9.2.10.1. Các hàm putc và fputc : 
Cấu trúc ngữ pháp : 
 int putc(int ch, FILE *fp); 
 int fputc(int ch, FILE *fp); 
Nguyên hàm trong : stdio.h . 
Trong đó : 
 ch là một giá trị nguyên 
 fp là một con trỏ tệp. 
Công dụng : 
 Hàm ghi lên tệp fp một ký tự có mẫ bằng 
 m=ch % 256. 
 ch được xem là một giá trị nguyên không dấu. Nếu thành công hàm cho mã ký 
tự được ghi, trái lại cho EOF 
Ví dụ : 
#include "stdio.h" 
main() 
{ 
 char msg[] = "Hello world\n"; 
 int i = 0; 
 while (msg[i]) 
 putc(msg[i++], stdout); /* stdout thiết bị ra chuẩn - Màn hình*/ 
 return 0; 
} 
Chương 9:Tập tin 
126 
9.2.12.2. Các hàm getc và fgettc : 
Cấu trúc ngữ pháp : 
 int gretc(FILE *fp); 
 int fputc(FILE *fp); 
Nguyên hàm trong : stdio.h . 
Trong đó : 
 fp là một con trỏ tệp. 
Công dụng : 
 Hàm đọc một ký tự từ tệp fp. Nếu thành công hàm sẽ cho mã đọc được ( có giá 
trị từ 0 đến 255). Nếu gặp cuối tệp hay có lỗi hàm sẽ trả về EOF. 
 Trong kiểu văn bản, hàm đọc một lượt cả hai mã 13, 10 và trả về giá trị 10. 
Khi gặp mã 26 hàm sẽ trả về EOF. 
Ví dụ : 
#include "string.h" 
#include "stdio.h" 
#include "conio.h" 
main() 
{ 
 FILE *stream; 
 char string[] = "Kiem tra"; 
 char ch; 
 /* Mở tệp để cập nhật*/ 
 stream = fopen("DUMMY.FIL", "w+"); 
 /*Viết một xâu ký tự vào tệp */ 
 fwrite(string, strlen(string), 1, stream); 
 /* Tìm vị trí đầu của tệp */ 
 fseek(stream, 0, SEEK_SET); 
 do 
Chương 9:Tập tin 
127 
 { 
 /* Đọc một ký tự từ tệp */ 
 ch = fgetc(stream); 
 /* Hiển thị ký tự */ 
 putch(ch); 
 } while (ch != EOF); 
 fclose(stream); 
 return 0; 
} 
9.2.13. Xoá tệp - hàm unlink: 
Cấu trúc ngữ pháp : 
 int unlink(const char *tên_tệp) 
Nguyên hàm trong : dos.h, io.h, stdio.h . 
Trong đó 
 tên_tệp là tên của tệp cần xoá. 
Công dụng : 
 Dùng để xoá một tệp trên đĩa. Nếu thành công, hàm cho giá trị 0, trái lại hàm 
cho giá trị EOF. 
Ví dụ : 
#include 
#include 
int main(void) 
{ 
 FILE *fp = fopen("junk.jnk","w"); 
 int status; 
 fprintf(fp,"junk"); 
 status = access("junk.jnk",0); 
 if (status == 0) 
 printf("Tệp tồn tại\n"); 
Chương 9:Tập tin 
128 
 else 
 printf("Tệp không tồn tại\n"); 
 fclose(fp); 
 unlink("junk.jnk"); 
 status = access("junk.jnk",0); 
 if (status == 0) 
 printf("Tệp tồn tại\n"); 
 else 
 printf("Tệp không tồn tại\n"); 
 return 0; 
} 

File đính kèm:

  • pdfCHUONG_9.pdf