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)
Đượ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,
33 trang |
Chia sẻ: thanhle95 | Lượt xem: 633 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng Kỹ thuật lập trình - Chương 9: Tập tin - Trần Quang, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Trần Quang
© 2016
Kỹ thuật lập trình
1
Chương 09: File
Chương 09
TẬP TIN
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
2
Chương 09: File
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.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
3
Chương 09: File
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 N
N bytes dữ liệu của một file
EOF
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
4
Chương 09: File
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)
Đượ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,
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
5
Chương 09: File
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
Dùng hàm fclose
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
6
Chương 09: File
Con trỏ đánh dấu trong tập tin
1 2 3 N
N bytes dữ liệu của một file
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()
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
7
Chương 09: File
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
8
Chương 09: File
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 *
Ví dụ: FILE *fp;
Kiểu FILE là kiểu cấu trúc do C định nghĩa sẵn
trong
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
9
Chương 09: File
Mở tập tin
fopen (, );
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
10
Chương 09: File
Chế độ mở tập tin
Chế độ Mô tả
r Mở tập tin để đọc.
w
Mở tập tin để ghi. Nếu tập tin đã tồn tại, xóa toàn bộ
nội dung tập tin đó.
a
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.
r+
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.
w+
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.
a+
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 đó.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
11
Chương 09: File
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
12
Chương 09: File
Đóng tập tin
Cú pháp:
int fclose (FILE *fp);
Ví dụ:
fclose(fp);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
13
Chương 09: File
Đọ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);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
14
Chương 09: File
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);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
15
Chương 09: File
Đọ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){
buffer[i] = ch;
ch = fgetc(fp);
i += 1;
}
buffer[i] = '\0';
}
CH = Đọc một ký tự
CH EOF
Đưa CH vào bộ đệm
CH = Đọc một ký tự
false
true
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
16
Chương 09: File
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);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
17
Chương 09: File
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);
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
18
Chương 09: File
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);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
19
Chương 09: File
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
20
Chương 09: File
Hàm fscanf( )
Hàm thư viện đọc dữ liệu từ tập tin theo định dạng:
fscanf ( , , );
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);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
21
Chương 09: File
Hàm fprintf ( )
Hàm thư viện ghi tập tin theo định dạng:
int fprintf (, , );
Việc sử dụng hàm fprintf() tương tự như hàm
printf(), chỉ có khác ở chỗ những gì in ra màn hình
sẽ được ghi lên tập tin.
Ví dụ:
fprintf (fp, "%d%s%.0g\n", 10, "!= " , gt(10));
fprintf (fp, "%s%d\n", "S= ", x*2+3);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
22
Chương 09: File
Di chuyển con trỏ đến 1 vị trí mới
Cú pháp:
int fseek (FILE *fp, long sb, int xp);
Trong đó
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:
SEEK_SET hay 0 : Xuất phát từ đầu file.
SEEK_CUR hay 1: Xuất phát từ vị trí hiện tại
của con trỏ chỉ vị trí.
SEEK_END hay 2 : Xuất phát từ cuối file.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
23
Chương 09: File
Di chuyển con trỏ đến 1 vị trí mới
Ví dụ:
fseek(fp, 1, SEEK_SET);
a = fgetc(fp);
printf("%c ", a);
fseek(fp, 3, SEEK_CUR);
a = fgetc(fp);
printf("%c ", a);
fseek(fp, -1, SEEK_END);
a = fgetc(fp);
printf("%c ", a);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
24
Chương 09: File
Di chuyển con trỏ về đầu tập tin
Cú pháp:
int rewind (FILE *fp);
Ví dụ:
while (!feof(fp)) {
a = getc(fp); printf("%c", a);
}
printf("\n");
rewind(fp);
while (!feof(fp)) {
a = getc(fp); printf("%c", a);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
25
Chương 09: File
Xác định vị trí hiện tại của con trỏ
Cú pháp:
int ftell (FILE *fp);
Ví dụ:
printf ("%d ", ftell (fp));
fseek (fp, -1, SEEK_END);
a = fgetc (fp);
printf ("%c ", a);
printf ("%d ", ftell(fp));
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
26
Chương 09: File
Random - Access File
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
27
Chương 09: File
Random - Access File
Là loại file được mở và cho truy cập ngẫu nhiên
Bao gồm một loạt các mẩu tin có cùng kích thước
(fixed-length records). Kích thước mẩu tin phụ
thuộc vào các thành phần (trường-field) bên trong
mẩu tin
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
28
Chương 09: File
struct
struct là kiểu dữ liệu có thể bao gồm các thành
phần bên trong, mỗi thành phần có thể thuộc kiểu
dữ liệu cơ bản khác như: int, char, float,
Khai báo:
struct structure_name {
data_type member1;
data_type member2;
data_type membern;
};
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
29
Chương 09: File
struct
Khai báo biến struct
struct person {
char name[50];
int cit_no;
float salary;
};
struct person p1, p2, p[20];
Gán giá trị khởi tạo cho biến struct:
struct person p3 = {"Le Minh", 10, 2000};
Truy cập vào từng thành phần dùng toán tử . (chấm)
printf ("%s\n", p3.name);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
30
Chương 09: File
Hàm fread()
Cú pháp:
size_t fread( void *buffer, size_t size, size_t count, FILE *fp);
Tham số:
buffer: con trỏ trỏ tới data cần ghi xuống file.
size: kích thước data ghi xuống file (tính theo byte)
count: số lượng data được ghi xuống file.
fp: con trỏ file
Ghi chú:
Hàm fread( ) đọc dữ liệu từ file, khác với hàm fscanf( ) ở
chỗ có thể đọc cả struct, object,(đọc cả khối dữ liệu chỉ
cần biết kích thước và cấu trúc).
Trả về số lượng data đọc được nếu thành công.
Nếu xảy ra lỗi hoặc gặp cuối file, hàm sẽ trả về số nguyên
nhỏ hơn số lượng data được ghi.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
31
Chương 09: File
Hàm fwrite()
Cú pháp
size_t fwrite( const void *buffer, size_t size,
size_t count, FILE *fp);
Tham số:
buffer: con trỏ trỏ tới data cần ghi xuống file.
size: kích thước data cần ghi xuống file (tính theo byte)
count: số lượng data được ghi xuống file.
Ghi chú:
Hàm fwrite() ghi data xuống file, khác với hàm fprintf( ) ở
chỗ hàm fwrite( ) có thể ghi cả struct, object,.. xuống file
theo kiểu binary. Hàm fprintf( ) chỉ có thể ghi dạng text
Trả về số lượng data được ghi xuống, nếu ghi thành công
Nếu xảy ra lỗi, hàm sẽ trả về số nguyên nhỏ hơn số lượng
data được ghi.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
32
Chương 09: File
Ví dụ về hàm fread() và fwrite()
struct Date { int d, m, y; };
FILE *fp;
struct Date ns1 = {30, 4, 2015}, ns2;
fp = fopen ("E:\\tmp\\data.dat","w+");
if (fwrite(&ns1, sizeof(ns1), 1, fp) != 1) {
printf ("Error writting"); return 0;
}
rewind(fp);
if (fread (&ns2, sizeof(ns2), 1, fp) != 1)
printf ("\nError reading ");
else
printf ("\nNgay sinh: %.2d/%.2d/%.4d", ns2.d, ns2.m, ns2.y);
fclose(fp);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
33
Chương 09: File
Nhập và in danh sách sinh viên
struct sinhvien {
char ten[30];
float dtb;
};
FILE *fp;
int n;
struct sinhvien sv;
fp = fopen ("E:\\tmp\\data.dat","w+");
for (int i=1; i<4; i++){
fflush (stdin);
printf ("\nNhap sv%d:\n", i);
printf (" Ten: "); gets(sv.ten);
printf (" dtb: "); scanf("%f", &sv.dtb);
fwrite (&sv, sizeof(struct sinhvien), 1, fp);
}
rewind(fp);
while ( fread(&sv, sizeof(struct sinhvien),1,fp) != 0 )
printf("\n%s\t%.2f", sv.ten, sv.dtb);
CuuDuongThanCong.com https://fb.com/tailieudientucntt