Violet
Dethi

Tin tức thư viện

Chức năng Dừng xem quảng cáo trên violet.vn

12087057 Kính chào các thầy, cô! Hiện tại, kinh phí duy trì hệ thống dựa chủ yếu vào việc đặt quảng cáo trên hệ thống. Tuy nhiên, đôi khi có gây một số trở ngại đối với thầy, cô khi truy cập. Vì vậy, để thuận tiện trong việc sử dụng thư viện hệ thống đã cung cấp chức năng...
Xem tiếp

Hỗ trợ kĩ thuật

  • (024) 62 930 536
  • 091 912 4899
  • hotro@violet.vn

Liên hệ quảng cáo

  • (024) 66 745 632
  • 096 181 2005
  • contact@bachkim.vn

tài liệu C++(8)

Wait
  • Begin_button
  • Prev_button
  • Play_button
  • Stop_button
  • Next_button
  • End_button
  • 0 / 0
  • Loading_status
Nhấn vào đây để tải về
Báo tài liệu có sai sót
Nhắn tin cho tác giả
(Tài liệu chưa được thẩm định)
Nguồn:
Người gửi: Lê Văn Thuận (trang riêng)
Ngày gửi: 00h:22' 09-04-2024
Dung lượng: 809.8 KB
Số lượt tải: 45
Số lượt thích: 0 người
Chương 09

TẬP TIN

Nguyễn Thanh Tùng

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
1
https://fb.com/tailieudientucntt

Nội dung







Tại sao phải dùng tập tin (file)?
Mô hình tập tin
Các loại tập tin
Các thao tác bắt buộc
Đọc và ghi dữ liệu vào tập tin
Tập tin văn bản




Tập tin nhị phân







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

Các hàm xử lý tập tin
Các ví dụ
Tổng kết

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
2
https://fb.com/tailieudientucntt

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


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


=> Để 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.

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
3
https://fb.com/tailieudientucntt

Mô hình tập tin


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






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.
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.
(Nhiều hệ thống EOF = -1)


1

2

EOF

3

N

N bytes dữ liệu của một file ở mức mô hình

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
4
https://fb.com/tailieudientucntt

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
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 đó.

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
5
https://fb.com/tailieudientucntt

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



(1) Khai báo sử dụng kiểu dữ liệu tập tin
(2) Mở tập tin




(3) Thao tác với tập tin





Hàm: fopen, nói sau
Đọc hay ghi dữ liệu
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

(4) Đóng tập tin


Hàm: fclose, nói sau

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
6
https://fb.com/tailieudientucntt

Các thao tác bắt buộc
Thẻ đánh dấu trong tập tin

N bytes dữ liệu của một file ở mức mô hình
1

2

3

N



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

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
7
https://fb.com/tailieudientucntt

Các thao tác bắt buộc
Thẻ đánh dấu trong tập tin

N bytes dữ liệu của một file ở mức mô hình
1

2

3

N



EOF

Sau khi đọc 1 byte dữ liệu, ví dụ sử dụng hàm fgetc

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
8
https://fb.com/tailieudientucntt

Các thao tác bắt buộc
Thẻ đánh dấu trong tập tin

N bytes dữ liệu của một file ở mức mô hình
1

2

3

N



EOF

Sau khi đọc 1 byte dữ liệu nữa

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
9
https://fb.com/tailieudientucntt

Các thao tác bắt buộc
Thẻ đánh dấu trong tập tin

N bytes dữ liệu của một file ở mức mô hình
1

2

3

N



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)

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
10
https://fb.com/tailieudientucntt

Tập tin văn bản: Đọc tập tin
Yêu cầu

Vào: tập tin văn bản
(đọc được)

Chương trình

Chương trình: đọc các dòng
văn bản và đưa vào bộ đệm

Ra: in lại các dòng
trên màn hình

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
11
https://fb.com/tailieudientucntt

Tập tin văn bản: Đọc tập tin
Ý tưởng

CH = Đọc một ký tự

CH <> EOF

false

true
Đưa CH vào bộ đệm
CH = Đọc một ký tự

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
12
https://fb.com/tailieudientucntt

Tập tin văn bản: Đọc tập tin
(1) Khai báo con trỏ tập tin

FILE* file_ptr = NULL;

Con trỏ đến tập tin, một danh hiệu

Kiểu dữ liệu FILE
Định nghĩa trong
 Đặt #include đầu tập tin
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
13
https://fb.com/tailieudientucntt

Tập tin văn bản: Đọc tập tin
(2) Mở tập 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);
}

• 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
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
14
https://fb.com/tailieudientucntt

Tập tin văn bản: Đọc tập tin
(2) Mở tập 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);
}
"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
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
15
https://fb.com/tailieudientucntt

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 đó.

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
16
https://fb.com/tailieudientucntt

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
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';
}

CH = Đọc một ký tự

false

CH <> EOF
true
Đưa CH vào bộ đệm
CH = Đọc một ký tự

Giả sử buffer đủ lớn để chứa toàn bộ dữ
liệu từ tập tin
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
17
https://fb.com/tailieudientucntt

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
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';
}
fgetc: hàm đọc từng ký tự

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
18
https://fb.com/tailieudientucntt

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
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;
}
• Nếu chỉ số vượt qua chỉ số giới
buffer[index] = '\0';
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

Trường hợp kiểm tra cả độ bộ đệm

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

• Gán ký tự kết thúc chuỗi cho bộ
đệm
Lập trình C/C++
19
https://fb.com/tailieudientucntt

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


Hàm fgetc:






Nhận vào con trỏ đến tập tin
Trả về một giá trị kiểu int
Nếu giá trị trả về từ hàm fgetc là EOF thì chỉ ra là kết thúc tập tin
Ngược lại:
 fgetc trả về một ký tự có thể ép kiểu vào unsigned char (0, ..,
255)
 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

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
20
https://fb.com/tailieudientucntt

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

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
21
https://fb.com/tailieudientucntt

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");
Trường Đại Họcreturn
Bách Khoa EXIT_SUCCESS;
Trung Tâm Kỹ Thuật Điện Toán
}
CuuDuongThanCong.com
© 2016

Hàm đọc ở
slide trước

Lập trình C/C++
22
https://fb.com/tailieudientucntt

Tập tin văn bản : Đọc file
Các hàm thao tác tập tin khác

Mô tả

Hàm
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
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
23
https://fb.com/tailieudientucntt

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",

file_ptr =
fopen("test.txt",

"r");

"w");

fclose(file_ptr)

fclose(file_ptr)

(4) Đóng tập
tin

Chỉ có bước số (3) Dành cho việc đọc và ghi là thực sự khác nhau nhiều

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
24
https://fb.com/tailieudientucntt

Tập tin văn bản: Ghi tập tin
Bài toá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:
Nguyen Van A
Tran Van B
Phan Dinh C



:9.8 , 7.2, 9.5
:4.0 , 5.3, 2.5
:8.7 , 7.9, 8.1

Phân tích bài toá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.
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.

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
25
https://fb.com/tailieudientucntt

Tập tin văn bản: Ghi tập tin
Bài toán


Phân tích bài toá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;

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
26
https://fb.com/tailieudientucntt

Tập tin văn bản: Ghi tập tin
Bài toán


Phân tích bài toá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},
};

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
27
https://fb.com/tailieudientucntt

Tập tin văn bản: Ghi tập tin
Bài toán


Phân tích bài toá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 đó.

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
28
https://fb.com/tailieudientucntt

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},
};

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
29
https://fb.com/tailieudientucntt

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;

}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
30
https://fb.com/tailieudientucntt

Tập tin văn bản có định dạng: đọc tập tin
Bài toán

Đọc tập tin có định dạng

Nguyen Van A
Tran Van B
Phan Dinh C

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

:9.8 , 7.2, 9.5
:4.0 , 5.3, 2.5
:8.7 , 7.9, 8.1

Lập trình C/C++
31
https://fb.com/tailieudientucntt

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);

1.
2.
3.
4.
5.

Khai báo con trỏ tập tin
Mở tập tin cho đọc
Đọc dữ liệu có định dạng
Đóng tập tin
In dữ liệu

system("pause");
return EXIT_SUCCESS;
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
32
https://fb.com/tailieudientucntt

Tập tin văn bản có định dạng: đọc tập tin
Các thao tác

Kiểu dữ liệu và các prototype hàm
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);

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
33
https://fb.com/tailieudientucntt

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);
}
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
34
https://fb.com/tailieudientucntt

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);
}
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
35
https://fb.com/tailieudientucntt

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;
}
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Các bước đọc dữ liệu
Lập trình C/C++
36
https://fb.com/tailieudientucntt

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;
}
Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
37
https://fb.com/tailieudientucntt

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;
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
38
https://fb.com/tailieudientucntt

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;
}
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
39
https://fb.com/tailieudientucntt

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);
}
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
40
https://fb.com/tailieudientucntt

Đọc và ghi với tập tin


Hai thao tác phổ biến với tâp tin là





Ghi vào tập tin
Đọc dữ liệu từ tập tin.

Ghi dữ liệu




Sử dụng các hàm thư viện
 Với tập tin văn bản: fprintf, fputs
 Với tập tin nhị phân: fwrite
Việc ghi thường dễ dàng hơn đọc.
 Với tập tin văn bản: fprintf tương tự như printf có các định
dạng
 %s: để ghi chuỗi, với độ rộng, canh lề mong muốn
 %f: để ghi số thực với độ rộng, độ chính xác mong muốn
 V.v

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
41
https://fb.com/tailieudientucntt

Đọc và ghi với tập tin


Ghi dữ liệu


Việc ghi thường dễ dàng hơn đọc.
 Với tập tin nhị phân, dùng hàm fwrite.
 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)

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
42
https://fb.com/tailieudientucntt

Đọc và ghi với tập tin


Đọc dữ liệu







Việc đọc dữ liệu từ tập tin thường phức tạp hơn ghi
Giải thuật đọc tốt:
 Phải làm việc được với cấu trúc tập tin bị thay đổi
Với tập tin nhị phân:
 Vì không biết trước bao nhiều phần tử có trong tập tin
  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.
Với tập tin văn bản:
 Việc đọc khó hay dễ tuỳ vào định dạng dữ liệu

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
43
https://fb.com/tailieudientucntt

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;
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
44
https://fb.com/tailieudientucntt

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);

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
45
https://fb.com/tailieudientucntt

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);
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
46
https://fb.com/tailieudientucntt

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);
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
47
https://fb.com/tailieudientucntt

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);
}
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
48
https://fb.com/tailieudientucntt

Tập tin nhị phân : Đọc tập tin
Các thao tác

Mở tập tin
FILE* file_ptr = NULL;
file_ptr = fopen(file, "rb");
if(file_ptr == NULL){
perror("Error in open file: ");
system("pause");
exit(EXIT_FAILURE);
}

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
49
https://fb.com/tailieudientucntt

Tập tin nhị phân : Đọc tập tin
Các thao tác

Đọc từng hồ sơ
int c= 0;
int num = 0;
while(true){
num = fread(&list[c], sizeof(Student), 1, file_ptr);
if(num != 1){
break;
}
c++;
}
*size = c;

Trường Đại Học Bách Khoa
Trung Tâm Kỹ Thuật Điện Toán
CuuDuongThanCong.com
© 2016

Lập trình C/C++
50
https://fb.com/tailieudientucntt
 
Gửi ý kiến