Bài giảng Lập trình C/C++ - Chương 9: Tập tin - Lê Thành Sách

Nội dung

n Tại sao phải dùng tập tin (file)?

n Mô hình tập tin

n Các loại tập tin

n Các thao tác bắt buộc

n Đọc và ghi dữ liệu vào tập tin

n Tập tin văn bản

n Đọc, ghi, đọc và ghi

n Tập tin nhị phân

n Đọc, ghi, đọc và ghi

n Các hàm xử lý tập tin

n Các ví dụ

n Tổng kết

pdf 52 trang phuongnguyen 5160
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình C/C++ - Chương 9: Tập tin - Lê Thành Sách", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình C/C++ - Chương 9: Tập tin - Lê Thành Sách

Bài giảng Lập trình C/C++ - Chương 9: Tập tin - Lê Thành Sách
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
1
Chương 09
TẬP TIN
Lê Thành Sách
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
2
Nội dung
n Tại sao phải dùng tập tin (file)?
n Mô hình tập tin
n Các loại tập tin
n Các thao tác bắt buộc
n Đọc và ghi dữ liệu vào tập tin
n Tập tin văn bản
n Đọc, ghi, đọc và ghi
n Tập tin nhị phân
n Đọc, ghi, đọc và ghi
n Các hàm xử lý tập tin
n Các ví dụ
n Tổng kết
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
3
Tại sao phải dùng tập tin (file)?
n Khi một chương trình kết thúc thực thi, các biến dữ liệu liên 
quan sẽ bị dọn dẹp khỏi bộ nhớ chính (RAM) của máy tính
n => Để dữ liệu không bị chương trình mất đi khi chương trình kết 
thúc, chương trình 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ường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
4
Mô hình tập tin
n Tập tin là một dãy các bytes dữ liệu, như hình vẽ, kết thúc 
bằng ký hiệu đặc biệt EOF
n EOF (End Of File): là giá trị đặt biệt, không trùng với bất cứ giá trị 
của byte dữ liệu nào.
n EOF: Ký hiệu mà các hàm đọc dữ liệu trả về để cho biết kết thúc tập 
tin.
n (Nhiều hệ thống EOF = -1)
1 2 3 N
N bytes dữ liệu của một file ở mức mô hình
EOF
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
5
Các loại tập tin
n Tập tin văn bản (text)
n 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
n 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.
n Tập tin nhị phân (binary)
n Đượ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
n Tập tin dành riêng cho chương trình nào đó đọc và diễn dịch theo ý 
của chương trình đó.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
6
Các thao tác bắt buộc
n (1) Khai báo sử dụng kiểu dữ liệu tập tin
n (2) Mở tập tin
n Hàm: fopen, nói sau
n (3) Thao tác với tập tin
n Đọc hay ghi dữ liệu
n Mỗi lần đọc hay ghi dữ liệu, thẻ đánh dấu trong tập tin tự động tăng 
đến phần tử tiếp theo
n (4) Đóng tập tin
n Hàm: fclose, nói sau
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
7
Các thao tác bắt buộc
Thẻ đánh dấu trong tập tin
1 2 3 N
N bytes dữ liệu của một file ở mức mô hình
EOF
Sau khi mở tập tin thành công, thẻ đánh dấu tự động chì đến byte đầu tiên 
của tập tin
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
8
Các thao tác bắt buộc
Thẻ đánh dấu trong tập tin
1 2 3 N
N bytes dữ liệu của một file ở mức mô hình
EOF
Sau khi đọc 1 byte dữ liệu, ví dụ sử dụng hàm fgetc
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
9
Các thao tác bắt buộc
Thẻ đánh dấu trong tập tin
1 2 3 N
N bytes dữ liệu của một file ở mức mô hình
EOF
Sau khi đọc 1 byte dữ liệu nữa
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
10
Các thao tác bắt buộc
Thẻ đánh dấu trong tập tin
1 2 3 N
N bytes dữ liệu của một file ở mức mô hình
EOF
Sau khi đã đọc thành công N bytes
Thẻ đánh dấu chỉ đến EOF
Lần đọc dữ liệu kế tiếp hàm đọc trả 
về giá trị EOF để nói rằng kết thúc 
tập tin, và giá trị trả về là EOF (-1) 
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
11
Tập tin văn bản: Đọc tập tin
Yêu cầu
Chương trình
Vào: tập tin văn bản
(đọc được)
Ra: in lại các dòng 
trên màn hình
Chương trình: đọc các dòng 
văn bản và đưa vào bộ đệm
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
12
Tập tin văn bản: Đọc tập tin 
Ý tưởng
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ường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
13
Tập tin văn bản: Đọc tập tin 
(1) Khai báo con trỏ tập tin
FILE* file_ptr = NULL;
Kiểu dữ liệu FILE
Định nghĩa trong 
è Đặt #include đầu tập tin
Con trỏ đến tập tin, một danh hiệu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
14
Tập tin văn bản: Đọc tập tin 
(2) Mở tập tin
• Mở tập tin bằng hàm fopen
• Tên tập tin: "test.txt”
• Mục tiêu của việc mở là: ”r” ó cho việc đọc (read)
• Kiểm tra xem file_ptr có NULL không
• = NULL nghĩa là không mở được tập tin
• = NULL, có thể chấm dứt thực thi
FILE* file_ptr = NULL;
file_ptr = fopen("test.txt", "r");
if(file_ptr == NULL){
perror("Loi da xay ra: ");
system("pause");
exit(EXIT_FAILURE);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
15
Tập tin văn bản: Đọc tập tin 
(2) Mở tập tin
"test.txt”: Chương trình tìm tập tin này ở thư mục hiện tại (chứa 
tập tin thực thi), hoặc trong các thư mục chứa trong biến môi trường 
PATH
Nếu chỉ ra đường dẫn, dùng HAI DẤU “\\” thay cho chỉ 01 dấu; vì “\” 
là ký tự điều khiển trong chuỗi
Ví dụ: Dùng C:\\DATA\\Test.txt thay cho: C:\DATA\Test.txt
FILE* file_ptr = NULL;
file_ptr = fopen("test.txt", "r");
if(file_ptr == NULL){
perror("Loi da xay ra: ");
system("pause");
exit(EXIT_FAILURE);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
16
Tập tin văn bản : Đọc tập tin 
(2) Mở tập tin – chế độ mở
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 đuôi của 
tập tin nếu nó 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 đuôi của tập tin đó.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
17
void doc_tap_tin(FILE* file_ptr, char* buffer){
int index = 0;
int ch = fgetc(file_ptr);
while(ch != EOF){
buffer[index] = ch;
ch = fgetc(file_ptr);
index += 1;
}
buffer[index] = '\0';
}
Tập tin văn bản : Đọc tập tin 
(3) Đọc tất cả các ký tự trong tập tin vào một bộ đệm
CH = Đọc một ký tự
CH EOF
Đưa CH vào bộ đệm
CH = Đọc một ký tự
false
true
Giả sử buffer đủ lớn để chứa toàn bộ dữ 
liệu từ tập tin
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
18
void doc_tap_tin(FILE* file_ptr, char* buffer){
int index = 0;
int ch = fgetc(file_ptr);
while(ch != EOF){
buffer[index] = ch;
ch = fgetc(file_ptr);
index += 1;
}
buffer[index] = '\0';
}
Tập tin văn bản : Đọc tập tin 
(3) Đọc tất cả các ký tự trong tập tin vào một bộ đệm
fgetc: hàm đọc từng ký tự
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
19
void doc_tap_tin(FILE* file_ptr, char* buffer){
int index = 0;
int ch = fgetc(file_ptr);
while(ch != EOF){
if(index < MAX_LEN - 1){
buffer[index] = ch;
ch = fgetc(file_ptr);
index += 1;
}
else break;
}
buffer[index] = '\0';
}
Tập tin văn bản : Đọc tập tin 
(3) Đọc tất cả các ký tự trong tập tin vào một bộ đệm
• Nếu chỉ số vượt qua chỉ số giới 
hạn thì thoát khỏi vòng lặp, không 
đọc nữa, dù còn ký tự trong tập 
tin
• Gán ký tự kết thúc chuỗi cho bộ 
đệm
Trường hợp kiểm tra cả độ bộ đệm
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
20
Tập tin văn bản : Đọc tập tin 
(3) Đọc tất cả các ký tự trong tập tin vào một bộ đệm
n Hàm fgetc:
n Nhận vào con trỏ đến tập tin
n Trả về một giá trị kiểu int
n Nếu giá trị trả về từ hàm fgetc là EOF thì chỉ ra là kết thúc tập tin
n Ngược lại:
n fgetc trả về một ký tự có thể ép kiểu vào unsigned char (0, .., 
255)
n fgetc đặt thẻ đánh dấu tại byte kế tiếp trên tập tin, để lần sau đó 
gọi fgetc sẽ đọc ký tự kế tiếp
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
21
Tập tin văn bản : Đọc tập tin 
(4) Đóng tập tin
• Đóng tập tin bằng hàm fclose
fclose(file_ptr);
printf("%s", buffer);
• In buffer ra màn hình
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
22
Tập tin văn bản : Đọc tập tin 
Chương trình hoàn chỉnh
#include 
#include 
#define MAX_LEN 1024
int main(){
//Mo tap tin
FILE* file_ptr = NULL;
file_ptr = fopen("test.txt", "r");
if(file_ptr == NULL){
perror("Loi da xay ra: ");
system("pause");
exit(EXIT_FAILURE);
}
//Doc tap tin
char buffer[MAX_LEN];
doc_tap_tin(file_ptr, buffer);
//Dong tap tin
fclose(file_ptr);
printf("%s", buffer);
system("pause");
return EXIT_SUCCESS;
}
Hàm đọc ở 
slide trước
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
23
Tập tin văn bản : Đọc file 
Các hàm thao tác tập tin khác
Hàm Mô tả
fopen Mở luồng xử lý tập tin.
fclose Đóng luồng xử lý tập tin.
fscanf Nhận các dữ liệu phổ biến như char, int, float v.v. từ tập tin.
fprintf In các dữ liệu phổ biến như char, int, float, v.v. lên tập tin.
rewind Quay con trỏ byte trong con trỏ FILE về đầu tập tin. Như vậy, ta có thể 
đọc tập tin nhiều lần mà không cần đóng rồi mở lại tập tin.
fgets Hàm fgets (char* str, int num, FILE* stream)
Đọc tập tin theo từng cụm num các ký tự và sao chép cụm đó vào 
mảng char mà str trỏ đến. Nếu một hàng trong tập chứa ít hơn num
các ký tự thì hàm sẽ sao toàn bộ hàng đó vào mảng mà str trỏ đến.
fputs Hàm fputs (const char* str, FILE* stream)
Ghi chuỗi ký tự mà str trỏ đến vào luồng xử lý tập tin đang mở.
Các hàm trên đều nằm trong thư viện stdio.h
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
24
Tập tin văn bản: Ghi tập tin
Các bước tương tự như đọc tập tin
Bước Đọc tâp tin Ghi tập tin
(1) Khai báo 
con trỏ tập tin
FILE *file_ptr FILE *file_ptr
(2) Mở tập tin file_ptr = 
fopen("test.txt", 
"r");
file_ptr = 
fopen("test.txt", 
"w");
(4) Đóng tập 
tin
fclose(file_ptr) fclose(file_ptr)
Chỉ có bước số (3) Dành cho việc đọc và ghi là thực sự khác nhau nhiều
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
25
Tập tin văn bản: Ghi tập tin
Bài toán
n Giả sử cần viết chương trình đọc và ghi tập tin có định 
dạng dạng như sau:
n Phân tích bài toán:
n Mỗi hàng dữ liệu gồm tên, 3 cột điểm (các con số thực). Độ rộng 
của từng cột là cố định. 
n Hàm fprintf để in các số liệu xuống tập tin có tính năng tương tự 
như printf à nên sử dụng.
Nguyen Van A :9.8 , 7.2, 9.5
Tran Van B :4.0 , 5.3, 2.5
Phan Dinh C :8.7 , 7.9, 8.1
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
26
Tập tin văn bản: Ghi tập tin
Bài toán
n Phân tích bài toán:
n Cần định nghĩa kiểu dữ liệu Student gồm các trường thông tin như 
sau
typedef struct{
char name[20];
float math, physics, english;
} Student;
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
27
Tập tin văn bản: Ghi tập tin
Bài toán
n Phân tích bài toán:
n Cần khai báo danh sách sinh viên. Có thể khởi động bằng một số 
dữ liệu mẫu để kiểm tra như sau:
Student list[] = {
{"Nguyen Van A", 9.8f, 7.2f, 9.5f},
{"Tran Van B", 4.0f, 5.3f, 2.5f},
{"Phan Dinh C", 8.7f, 7.9f, 8.1f},
};
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
28
Tập tin văn bản: Ghi tập tin
Bài toán
n Phân tích bài toán:
n Ý tưởng chính của việc ghi là: duyệt qua từng phần tử trong mảng 
và ghi từng phần tử vào tập tin
for(int i=0; i< 3; i++){
fprintf(file_ptr, "%-15s:%-5.1f,%5.1f,%5.1f\n", 
list[i].name, 
list[i].math, list[i].physics, list[i].english);
}
file_ptr: là con trỏ đến FILE, và đã mở tập tin cho ghi trước đó.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
29
Tập tin văn bản: Ghi tập tin
Bài toán – chương trình hoàn chỉnh
#include 
#include 
#define MAX_LEN 1024
typedef struct{
char name[20];
float math, physics, english;
} Student;
int main(){
Student list[] = {
{"Nguyen Van A", 9.8f, 7.2f, 9.5f},
{"Tran Van B", 4.0f, 5.3f, 2.5f},
{"Phan Dinh C", 8.7f, 7.9f, 8.1f},
};
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
30
Tập tin văn bản: Ghi tập tin
Bài toán – chương trình hoàn chỉnh
FILE* file_ptr = NULL;
file_ptr = fopen("data.txt", "a");
if(file_ptr == NULL){
perror("Co loi: ");
system("pause");
exit(EXIT_FAILURE);
}
for(int i=0; i< 3; i++){
fprintf(file_ptr, "%-15s:%-5.1f,%5.1f,%5.1f\n", 
list[i].name, 
list[i].math, list[i].physics, list[i].english);
}
fclose(file_ptr);
system("pause");
return EXIT_SUCCESS;
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
31
Tập tin văn bản có định dạng: đọc tập tin
Bài toán
Nguyen Van A :9.8 , 7.2, 9.5
Tran Van B :4.0 , 5.3, 2.5
Phan Dinh C :8.7 , 7.9, 8.1
Đọc tập tin có định dạng
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
32
Tập tin văn bản có định dạng: đọc tập tin
Các thao tác
int main(){
Student list[100];
int size = 0;
FILE* file_ptr = NULL;
mo_tap_tin(&file_ptr, "data.txt");
size = doc_du_lieu(file_ptr, list);
dong_tap_tin(file_ptr);
in_du_lieu(list, size);
system("pause");
return EXIT_SUCCESS;
}
1. Khai báo con trỏ tập tin
2. Mở tập tin cho đọc
3. Đọc dữ liệu có định dạng
4. Đóng tập tin
5. In dữ liệu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
33
Tập tin văn bản có định dạng: đọc tập tin
Các thao tác
typedef struct{
char name[20];
float math, physics, english;
} Student;
void mo_tap_tin(FILE** file_ptr, char tap_tin[]);
void dong_tap_tin(FILE* file_ptr);
bool doc_ten(FILE* file_ptr, char* name, char end_char);
bool doc_diem(FILE* file_ptr, float *math, float *physics, float *english);
bool xoa_xuong_hang(FILE* file_ptr);
int doc_du_lieu(FILE* file_ptr, Student list[]);
void in_du_lieu(Student list[], int size);
Kiểu dữ liệu và các prototype hàm
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
34
Tập tin văn bản có định dạng: đọc tập tin
Các thao tác
Mở tập tin cho đọc
void mo_tap_tin(FILE** file_ptr, char tap_tin[]){
*file_ptr = fopen(tap_tin, "r");
if(*file_ptr == NULL){
perror("Co loi: ");
system("pause");
exit(EXIT_FAILURE);
}
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
35
Tập tin văn bản có định dạng: đọc tập tin
Các thao tác
Mở và đóng tập tin cho đọc
void mo_tap_tin(FILE** file_ptr, char tap_tin[]){
*file_ptr = fopen(tap_tin, "r");
if(*file_ptr == NULL){
perror("Co loi: ");
system("pause");
exit(EXIT_FAILURE);
}
}
void dong_tap_tin(FILE* file_ptr){
fclose(file_ptr);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
36
Tập tin văn bản có định dạng: đọc tập tin
Các thao tác
int doc_du_lieu(FILE* file_ptr, Student list[]){
int size =0;
bool doc_tiep = true;
while(doc_tiep){
doc_tiep = doc_ten(file_ptr, list[size].name, ':');
if(!doc_tiep) break;
doc_tiep = doc_diem(file_ptr, 
&list[size].math, 
&list[size].physics, &list[size].english);
if(!doc_tiep) break;
doc_tiep = xoa_xuong_hang(file_ptr);
size += 1;
if(!doc_tiep) break;
}//while
return size;
} Các bước đọc dữ liệu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
37
Tập tin văn bản có định dạng: đọc tập tin
Các thao tác
bool doc_ten(FILE* file_ptr, char* name, char end_char){
int i = 0;
int ch = fgetc(file_ptr);
while((ch != ':') && (ch != EOF)){
name[i] = ch;
i += 1;
ch = fgetc(file_ptr);
}
name[i] = '\0';
if(ch == EOF) return false;
else return true;
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
38
Tập tin văn bản có định dạng: đọc tập tin
Các thao tác
bool doc_diem(FILE* file_ptr, 
float *math, float *physics, float *english){
int num = fscanf(file_ptr, "%f , %f, %f", 
math,
physics,
english);
if(num != 3) return false;
else return true;
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
39
Tập tin văn bản có định dạng: đọc tập tin
Các thao tác
bool xoa_xuong_hang(FILE* file_ptr){
int ch;
ch = fgetc(file_ptr);
while((ch != EOF) && (ch == '\n') ){
ch = fgetc(file_ptr);
}
if(ch == EOF) return false;
else{
fseek(file_ptr, -1, SEEK_CUR);
return true;
}
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
40
Tập tin văn bản có định dạng: đọc tập tin
Các thao tác
void in_du_lieu(Student list[], int size){
for(int i=0; i< size; i++){
printf("%-20s:%-5.1f,%5.1f,%5.1f\n", 
list[i].name, 
list[i].math, 
list[i].physics, 
list[i].english);
}
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
41
Đọc và ghi với tập tin
n Hai thao tác phổ biến với tâp tin là
n Ghi vào tập tin
n Đọc dữ liệu từ tập tin.
n Ghi dữ liệu
n Sử dụng các hàm thư viện
n Với tập tin văn bản: fprintf, fputs
n Với tập tin nhị phân: fwrite
n Việc ghi thường dễ dàng hơn đọc.
n Với tập tin văn bản: fprintf tương tự như printf có các định 
dạng
n %s: để ghi chuỗi, với độ rộng, canh lề mong muốn
n %f: để ghi số thực với độ rộng, độ chính xác mong muốn
n V.v
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
42
Đọc và ghi với tập tin
n Ghi dữ liệu
n Việc ghi thường dễ dàng hơn đọc.
n Với tập tin nhị phân, dùng hàm fwrite.
n Hàm này cho phép đặc tả số lượng và kích thước mỗi phần 
tử (các phần tử có thể là struct hay array) 
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
43
Đọc và ghi với tập tin
n Đọc dữ liệu
n Việc đọc dữ liệu từ tập tin thường phức tạp hơn ghi
n Giải thuật đọc tốt:
n Phải làm việc được với cấu trúc tập tin bị thay đổi
n Với tập tin nhị phân:
n Vì không biết trước bao nhiều phần tử có trong tập tin 
n è Giải thuật cần đọc từng phần tử, cho đến khi gặp cuối tập 
tin hoặc đến khi một cấu trúc bị lỗi nên chấm dứt việc đọc từ 
đó trong tập tin.
n Với tập tin văn bản:
n Việc đọc khó hay dễ tuỳ vào định dạng dữ liệu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
44
Tập tin nhị phân: Ghi tập tin
Các thao tác
int main(){
Student list[MAX_SIZE];
int size;
size = sinh_du_lieu_mau(list);
ghi_du_lieu(list, size, "stu_list.data");
in_du_lieu(list, size);
printf("\n\n");
system("pause");
return EXIT_SUCCESS;
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
45
Tập tin nhị phân : Ghi tập tin 
Các thao tác
#include 
#include 
#include 
#define MAX_SIZE 100
typedef struct{
char name[20];
float math, physics, english;
} Student;
int sinh_du_lieu_mau(Student *list);
void ghi_du_lieu(Student *list, int size, char* file);
void in_du_lieu(Student *list, int size);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
46
Tập tin nhị phân : Ghi tập tin 
Các thao tác
int sinh_du_lieu_mau(Student *list){
time_t t;
srand((unsigned int) time(&t));
for(char c='A'; c <= 'Z'; c++){
list[c - 'A'].name[0] = c;
list[c - 'A'].name[1] = '\0';
list[c - 'A'].math = ((float)rand()/RAND_MAX)*10;
list[c - 'A'].physics = ((float)rand()/RAND_MAX)*10;
list[c - 'A'].english = ((float)rand()/RAND_MAX)*10;
}
return ('Z' - 'A' + 1);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
47
Tập tin nhị phân : Ghi tập tin 
Các thao tác
void ghi_du_lieu(Student *list, int size, char* file){
FILE* file_ptr = NULL;
file_ptr = fopen(file, "ab+");
if(file_ptr == NULL)
exit(EXIT_FAILURE);
fwrite(list, sizeof(Student), size, file_ptr);
fclose(file_ptr);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
48
Tập tin nhị phân : Ghi tập tin 
Các thao tác
void in_du_lieu(Student *list, int size){
for(int i=0; i< size; i++){
printf("%-20s:%-5.1f,%-5.1f,%-5.1f\n", 
list[i].name, 
list[i].math, 
list[i].physics, 
list[i].english);
}
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
49
Tập tin nhị phân : Đọc tập tin 
Các thao tác
FILE* file_ptr = NULL;
file_ptr = fopen(file, "rb");
if(file_ptr == NULL){
perror("Error in open file: ");
system("pause");
exit(EXIT_FAILURE);
}
Mở tập tin
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
50
Tập tin nhị phân : Đọc tập tin 
Các thao tác
int c= 0;
int num = 0;
while(true){
num = fread(&list[c], sizeof(Student), 1, file_ptr);
if(num != 1){
break;
}
c++;
}
*size = c;
Đọc từng hồ sơ
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
51
Tập tin nhị phân : Đọc tập tin 
Các thao tác
Đóng tâp tin
fclose(file_ptr);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
© 2016
Lập trình C/C++
52
Tập tin nhị phân : Đọc tập tin 
Các thao tácvoid doc_du_lieu(Student *list, int *size, char* file){
FILE* file_ptr = NULL;
file_ptr = fopen(file, "rb");
if(file_ptr == NULL){
perror("Error in open file: ");
system("pause");
exit(EXIT_FAILURE);
}
int c= 0;
int num = 0;
while(true){
num = fread(&list[c], sizeof(Student), 1, file_ptr);
if(num != 1){
break;
}
c++;
}
*size = c;
fclose(file_ptr);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt

File đính kèm:

  • pdfbai_giang_lap_trinh_cc_chuong_9_tap_tin_le_thanh_sach.pdf