Chương 09
TẬP TIN
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
1
Tập tin (file)
Tất cả các biến dữ liệu của chương trình được lưu
trong bộ nhớ RAM của máy tính. Khi chương trình
kết thúc, tất cả các biến này sẽ bị xóa đi.
Để giữ các dữ liệu này lại khi chương trình kết
thúc, ta cần lưu chúng dưới dạng tập tin (file) vào
các thiết bị lưu trữ như ổ cứng, CD, DVD, v.v.
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
2
Mơ hình tập tin
Tập tin là một dãy các bytes dữ liệu kết thúc bằng
ký tự đặc biệt EOF
EOF (End Of File): là giá trị đặc biệt, không trùng
với bất cứ giá trị của byte dữ liệu nào.
EOF: khi dùng các hàm đọc dữ liệu trả về EOF là
biết kết thúc tập tin.
(Nhiều hệ thống EOF = -1)
…
1
2
3
EOF
N
N bytes dữ liệu của một file
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
3
Các loại tập tin
Tập tin văn bản (text)
Các byte trong mơ hình tập tin chứa các ký tự đọc
được (có nghĩa) bởi con người
Tập tin có thể mở ra để đọc và thay đổi bởi chương
trình soạn thảo văn bản như NOTEPAD.
Tập tin nhị phân (binary)
Trần Quang
© 2016
Được tạo bởi chương trình nào đó, khơng dành cho
con người đọc và hiểu trực tiếp bằng NOTEPAD
Các tập tin này phải dùng chương trình dành riêng
nào đó mới đọc và diễn dịch được. Ví dụ file .doc
của MS Word, file ảnh .jpg, file thực thi .exe, …
Chương 09: File
Kỹ thuật lập trình
4
Quy trình xử lý tập tin
1. Khai báo con trỏ tập tin
2. Mở tập tin
Dùng hàm: fopen
3. Thao tác với tập tin
Đọc hay ghi dữ liệu
Mỗi lần đọc hay ghi dữ liệu, con trỏ đánh dấu trong
tập tin tự động tăng đến phần tử tiếp theo
4. Đóng tập tin
Trần Quang
© 2016
Dùng hàm fclose
Chương 09: File
Kỹ thuật lập trình
5
Con trỏ đánh dấu trong tập tin
N bytes dữ liệu của một file
1
2
3
…
N
EOF
Sau khi mở tập tin thành công, con trỏ đánh dấu tự động
chỉ đến byte đầu tiên của tập tin
1
2
3
…
N
EOF
Sau khi đọc 1 byte dữ liệu, ví dụ sử dụng hàm fgetc()
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
6
Con trỏ đánh dấu trong tập tin
1
2
3
N
…
EOF
Sau khi đã đọc xong N bytes,
con trỏ đánh dấu chỉ đến EOF
Lần đọc dữ liệu kế tiếp hàm đọc sẽ trả về
giá trị EOF cho biết đã kết thúc tập tin
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
7
Khai báo con trỏ tập tin (FILE *)
Biến (con trỏ) trong chương trình dùng để gắn kết
với tập tin trên đĩa được định nghĩa với kiểu đặc
biệt theo cú pháp sau:
FILE *<tên biến>
Ví dụ:
FILE *fp;
Kiểu FILE là kiểu cấu trúc do C định nghĩa sẵn
trong <stdio.h>
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
8
Mở tập tin
fopen (<filename>, <mode> );
Ví dụ: FILE *fp;
fp = fopen("c:\\test.txt", "r");
filename là tên tập tin trên đĩa, chú ý dùng \\ trong
đường dẫn
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
9
Chế độ mở tập tin
Chế độ
r
w
a
r+
w+
a+
Trần Quang
© 2016
Mơ tả
Mở tập tin để đọc.
Mở tập tin để ghi. Nếu tập tin đã tồn tại, xóa tồn bộ
nội dung tập tin đó.
Nối tập tin. Mở tập tin đã có sẵn hoặc tạo mới tập tin,
ghi vào cuối tập tin nếu đã tồn tại.
Mở tập tin cho phép đọc lẫn ghi. Không tạo mới tập
tin nếu tập tin chưa có sẵn.
Mở tập tin cho phép đọc lẫn ghi. Tạo mới tập tin nếu
tập tin chưa có sẵn.
Nối tập tin, cho phép đọc tập tin. Mở tập tin đã có
sẵn hoặc tạo mới tập tin, ghi vào cuối tập tin đó.
Chương 09: File
Kỹ thuật lập trình
10
Kiểm tra việc mở tập tin
FILE *fp;
fp = fopen ("E:\\tmp\\vidu.txt", "r");
if (fp == NULL)
printf("Khong mo duoc file\n");
else {
// xử lý file
}
if (fp == NULL) {
printf("Khong mo duoc file\n");
return;
}
// xử lý file
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
11
Đóng tập tin
Cú pháp:
int fclose (FILE *fp);
Ví dụ:
fclose(fp);
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
12
Đọc 1 ký tự từ tập tin
Cú pháp:
int fgetc (FILE *fp);
Ví dụ:
char c;
FILE *fp;
fp = fopen ("E:\\tmp\\vidu.txt", "r");
c = fgetc (fp);
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
13
Hàm kiểm tra cuối tập tin
Cú pháp:
int feof (FILE *fp)
Hàm trả về giá trị khác 0 nếu gặp cuối file khi đọc,
trái lại hàm cho giá trị 0.
Ví dụ:
char c;
FILE *fp;
fp = fopen("E:\\tmp\\vidu.txt", "r");
while ( !feof(fp) ) {
c = fgetc(fp);
printf("%c", c);
}
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
14
Đọc tất cả các ký tự trong tập tin vào bộ đệm
Giả sử buffer đủ lớn để chứa toàn bộ dữ liệu từ tập tin
void readFile(FILE* fp, char* buffer){
int i = 0;
int ch = fgetc(fp);
while(ch != EOF){
CH = Đọc một ký tự
buffer[i] = ch;
ch = fgetc(fp);
CH <> EOF
i += 1;
true
Đưa CH vào bộ đệm
}
CH = Đọc một ký tự
buffer[i] = '\0';
}
Trần Quang
© 2016
Chương 09: File
false
Kỹ thuật lập trình
15
Ghi 1 ký tự vào tập tin
Cú pháp:
int fputc (char c, FILE *fp);
Ví dụ:
FILE *fp;
fp = fopen ("E:\\tmp\\vidu2.txt", "w");
fputc ('A', fp);
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
16
Hàm fgets() – fputs()
Cú pháp:
char *fgets(char *str, int n, FILE *fp);
Dùng để đọc 1 chuỗi từ file vào biến str, n là số ký tự
tối đa sẽ đọc
Hàm trả về con trỏ tới string đọc được nếu thành công
Hàm trả về NULL nếu xảy ra lỗi hoặc gặp cuối file.
Cú pháp:
int fputs(const char *str, FILE *fp);
Trần Quang
© 2016
Dùng để ghi 1 chuỗi vào file
Hàm trả về giá trị không âm nếu ghi thành cơng
Chương 09: File
Kỹ thuật lập trình
17
fgets() – fputs()
Ví dụ:
char s[255];
FILE *fp;
printf ("Nhap vao 1 cau: ");
fgets (s, 255, stdin);
fp = fopen ("E:\\tmp\\vidu.txt","w+");
fputs (s, fp);
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
18
fgets() – fputs()
Ví dụ:
char s[100];
FILE *fp;
fp = fopen ("E:\\tmp\\vidu.txt","w+");
if (fp==NULL) return 0;
fputs ("Tran van Hung\n", fp);
fputs ("Le Thi Thu Thao\n", fp);
rewind(fp);
fgets (s,100, fp);
printf ("%s", s);
// Tran Van Hung
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
19
Hàm fscanf( )
Hàm thư viện đọc dữ liệu từ tập tin theo định dạng:
fscanf ( <file_ptr>, <format>, <argument, …> );
Việc sử dụng hàm fscanf() tương tự như hàm
scanf(), chỉ có khác ở chỗ những gì lẽ ra nhập từ
bàn phím sẽ được đọc vào từ tập tin.
Ví dụ:
fscanf (fp, "%d", &n);
fscanf (fp, "%f", &(sv1->diem_btl);
Trần Quang
© 2016
Chương 09: File
Kỹ thuật lập trình
20