Bài giảng Kỹ thuật lập trình Chương 6 Thao tác trên tập tin cung cấp cho người học các kiến thức Khái niệm, khai báo, các thao tác trên tập tin. Cuối| Bài giảng có phần bài tập giúp người học có thể ôn tập và củng cố kiến thức đã học.
Trang 4Khái niệm
• File cho phép lưu trữ dữ liệu ở bộ nhớ ngoài (đĩa)
• File có thể lưu dữ liệu kích thước lớn với số lượng
các phần tử không hạn chế (chỉ bị hạn chế bởi dung
lượng của bộ nhớ ngoài)
Trang 5Khái niệm
• Biến File: là một biến thuộc kiểu dữ liệu tập tin dùng
để đại diện cho một tập tin
• Con trỏ tập tin: Xác định vị trí trong tập tin khi thao
tác đọc /ghi
• Phân loại File:
• File text
• File nhị phân
Trang 6File text
• Dùng để ghi các ký tự lên đĩa dưới dạng mã Ascii
• Dữ liệu của tập tin được lưu trữ thành các dòng, mỗi dòng được kết thúc bằng ký tự xuống dòng (new line), ký hiệu
‘\n’
• Mỗi tập tin được kết thúc bởi ký tự EOF (End Of File) có
mã Ascii là 26 (xác định bởi tổ hợp phím Ctrl + Z)
Trang 7File nhị phân
• Một dãy các bytes liên tục
• Nội dung dữ liệu được mã hóa
Trang 8CÁC THAO TÁC TRÊN FILE
Trang 9Các thao tác khi thao tác trên File
1 Khai báo con trỏ file
2 Mở file
3 Thao tác đọc/ ghi trên file
4 Đóng file
Trang 10Khai báo con trỏ file
• Cú pháp:
FILE <Danh sách các biến con trỏ>;
• Các biến trong danh sách phải là các con trỏ và được phân cách bởi dấu phẩy(,)
• Ví dụ: FILE *f1, *f2;
Trang 11Mở file
• Cú pháp:
FILE *fopen(char *path, const char *mode)
• Trong đó:
• path: chuỗi chỉ đường dẫn đến tập tin trên đĩa
• mode: chuỗi xác định cách thức mà tập tin sẽ mở
• Hàm fopen trả về một con trỏ tập tin Nếu có lỗi xuất hiện trong khi mở tập tin thì trả về con trỏ NULL
Trang 12Các thông tin Mode
r Mở tập tin văn bản để đọc
w Tạo ra tập tin văn bản mới để ghi
a Nối vào tập tin văn bản
rb Mở tập tin nhị phân để đọc
wb Tạo ra tập tin nhị phân để ghi
ab Nối vào tập tin nhị phân
r+ Mở một tập tin văn bản để đọc/ghi
w+ Tạo ra tập tin văn bản để đọc ghi
a+ Nối vào hay tạo mới tập tin văn bản để đọc/ghi
r+b Mở ra tập tin nhị phân để đọc/ghi
w+b Tạo ra tập tin nhị phân để đọc/ghi
a+b Nối vào hay tạo mới tập tin nhị phân
Trang 13Ví dụ tạo mới file text “test.txt” ở ổ đĩa D:
Trang 14• Trả về EOF nếu có xuất hiện lỗi
• Đóng tất cả các tập tin lại: int fcloseall()
Trang 15Thao tác trên File text
ĐỌC TẬP TIN
1 fscanf(FILE *, định dạng, các tham biến) Đọc dữ liệu từ tập tin fscanf(f, “%d”, &x);
2 fgets(chuỗi, kích thước tối đa, FILE *)
Đọc chuỗi ký tự từ tập tin với kích thước tối đa cho phép, hoặc gặp ký tự xuống dòng
char s[80];
fgets(s, 80, f);
3 getc(FILE *) Đọc ký tự từ tập tin char c=getc(f);
GHI TẬP TIN
1 fprintf(FILE *, định dạng, các tham biến) Ghi dữ liệu vào tập tin fprintf(f, “%d”, x);
Trang 16Ví dụ
Tạo tập tin văn bản “so.out” gồm n số nguyên, các số của
dãy được tạo ngẫu nhiên có giá trị không vượt quá M (n, M
đọc từ tập tin “so.inp”) Kết quả chương trình là 1 tập tin
văn bản có dòng thứ nhất ghi số n; n dòng tiếp theo ghi các
số tạo được, mỗi số trên một dòng
File so.inp 3
10
File so.out 3 5 7 2
Trang 17# define in “SO.INP”
# define out “SO.OUT”
void DocFile(int &n, int &M)
int main() {
int n, M;
srand((unsigned int)time(NULL));
DocFile(n, M);
GhiFile(n, M);
return 0;
}
Trang 18Bài tập
Viết các hàm sau:
1 Tạo mảng 1 chiều số nguyên a (giá trị ngẫu nhiên < 100) có kích
thước n (0<n<10000) Lưu vào tập tin “mang.inp” theo định dạng:
• Dòng đầu tiên lưu giá trị n
• Dòng tiếp theo lưu các phần tử của mảng cách nhau bởi khoảng
trắng
2 Đọc mảng 1 chiều từ file “mang.inp” và sắp xếp mảng theo thứ tự tăng dần Lưu vào file “sapxep.out” theo cấu trúc tương tự câu 1.
Trang 19Bài tập
Cho file “test.inp” có cấu trúc như sau
• Dòng đầu tiên là số nguyên n
• Dòng tiếp theo là n giá trị nguyên cách nhau bởi khoảng trắng
Hãy viết các hàm tìm phần tử có giá trị lớn nhất, phần tử nhỏ nhất, số lượng phần tử chẵn, lẻ Sau đó lưu vào file “kq.out” gồm các dòng sau:
• Dòng 1: So lon nhat la: …
• Dòng 2: So nho nhat la: …
• Dòng 3: So phan tu chan la: …
Trang 20Thao tác trên File nhị phân
ĐỌC TẬP TIN
1 fread(&ptr, size, len, FILE *)
ptr: vùng nhớ để lưu
dữ liệu đọc
size: kích thước mỗi
ô nhớ (tính bằng byte)
len: độ dài dữ liệu cần đọc
int a[30], b, n; fread(a,
sizeof(int), n , f); Fread(&b,
sizeof(int), 1 , f); GHI TẬP TIN
1 fwrite(&prt, size, len, FILE *) Tham số tương tự như hàm fread fwrite(a, sizeof(int), n , f);
Trang 21Các thao tác khác trên File
Kiểm tra vị trí cuối cùng trong File
Trang 22ĐỌC, GHI KIỂU CẤU TRÚC TRÊN FILE
Trang 23Đọc kiểu cấu trúc trên file
int fread (void *p, int size , int n, FILE *fp);
• p: con trỏ trỏ tới vùng nhớ chứa dữ liệu đọc được
• size: kích thước của mẫu tin (byte)
• n: là số mẫu tin cần đọc
• fp: là con trỏ file
Hàm sẽ trả về một giá trị = số mẫu tin thực sự đọc được
Trang 24Ghi kiểu cấu trúc trên file
int fwrite (void *p, int size , int n , FILE *fp);
• p: con trỏ trỏ tới vùng nhớ chứa dữ liệu cần ghi
• size: kích thước của mẫu tin (byte)
• n: số mẫu tin cần ghi
• fp: con trỏ file
Hàm sẽ trả về một giá trị = số mẫu tin thực sự ghi được
Trang 25Ví dụ
Viết chương trình phát sinh ngẫu nhiên danh sách các tọa
độ điểm trong mặt phẳng Oxy (Giá trị của mỗi trục tọa độ
phát sinh trong khoảng [-50 50])
• Lưu danh sách này vào file “dsToaDo.inp”
• Đọc file “dsToaDo.inp” trên và lưu vào file
“toaDoDuong.out” những tọa độ điểm thuộc phần tư thứ
nhất
Trang 27void PhatSinh( MyPoint *a, int n) {
for (int i = 0 ; i < n; i++) {
a[i] x = rand() % 51 - rand() % 51 ; a[i] y = rand() % 51 - rand() % 51 ; }
}
void XuatMang( MyPoint *a, int n) {
for (int i = 0 ; i < n; i++) {
printf("( %d , %d ); ", a[i] x , a[i] y );
Trang 28void LuuFile( MyPoint *a, int n, char *fileName) { FILE *fp;
fp = fopen(fileName, "wb");
for (int i = 0 ; i < n; i++) {
fwrite(&a[i], sizeof( MyPoint ), 1 , fp);
}
fclose(fp);
}
Trang 29void LuuToaDoDuong(char *fileIn, char *fileOut) {
FILE *fIn, *fOut;
Trang 30void XuatFile(char *fileName) {
Trang 31int main() {
MyPoint *a;
int n;
srand((unsigned int) time(NULL));
printf("So luong toa do can phat sinh: ");
LuuToaDoDuong("dsToaDo.inp", "toaDoDuong.out");
printf(" \n ***Danh sach toa do trong file: \n ");
Trang 32Các thao tác khác trên File
• Xóa File
remove (đường dẫn tập tin);
• Đổi tên File
rename (tên tập tin cũ, tên tập tin mới);
• Cho biết vị trí con trỏ File
ftell (FILE *);
Trang 33Các thao tác khác trên File
Di chuyển con trỏ File từ vị trí xuất phát cho trước
fseek (FILE *, độ dời, vị trí xuất phát);
Các vị trí:
• SEEK_SET đầu tập tin (giá trị 0)
• SEEK_END cuối tập tin (giá trị 2)
• SEEK_CUR vị trí hiện hành (giá trị 1)
Độ dời tính bằng byte
Trang 342 Bổ sung tọa độ điểm này vào cuối file “dsToaDo.inp”
3 Nếu tọa độ điểm vừa nhập có tọa độ thuộc phần tư thứ
nhất thì bổ sung thêm vào cuối file “toaDoDuong.out”
4 Xóa tọa độ điểm d cho trước (nếu có xuất hiện) trong file
“dsToaDo.inp” và “toaDoDuong.out”
Trang 35Q&A