Hàm dùng để mở một File, nếu thành công trả về con trỏ kiểu File ứng với File vừa mở, ngược lại trả về NULL.. Nếu thành công trả về mã ký tự được ghi, ngược lại trả về EOF... int getcFI
Trang 2Bài tập
Một số hàm xử lý khác
Các thao tác xử lý căn bản Phân loại tập tin
Giới thiệu về tập tin
Trang 5Tập tin văn bản ASCII
Trang 6Tập tin nhị phân
Trang 9Khai báo biến tập tin bằng từ khóa FILE được định nghĩa trong <stdio.h> với cấu trúc:
Ví dụ:
FILE *fp; // Khai báo 1 biến con trỏ file
FILE *fp1,*fp2 // Khai báo nhiều biến con trỏ file
FILE Danh sách biến con
trỏ
Trang 10Hàm dùng để mở một File, nếu thành công trả về con trỏ kiểu File ứng với File vừa mở, ngược lại trả
về NULL
Trong đó:
đường dẫn: chỉ định tên đường dẫn để truy xuất tập tin Nếu trong có
đường dẫn thì sẽ truy xuất trong thư mục hiện hành.
Ví dụ:
fopen (“test.txt”,…) // Không đường dẫn
fopen (“D:\\test\\test.txt”,…) // Có đường dẫn
kiểu là tổ hợp các ký tự mô tả các tùy chọn sau:
fopen (char *đường dẫn, char *kiểu)
Trang 11“w” Mở tập tin chỉ để ghi vào đĩa (nếu đã có thì
nội dụng tập tin cũ sẽ bị xóa)
“w+” Mở một tập tin mới để đọc, ghi (nếu đã có thì nội
dụng tập tin cũ sẽ bị xóa).
“r” Mở tập tin đã có chỉ để đọc từ đĩa vào bộ nhớ.
“r+” Mở tập tin đã có trên đĩa để đọc hoặc ghi
“a” Mở tập tin để thêm vào (append) cuối tập tin
(không đọc được)
“a+” Mở tập tin để đọc, ghi Nếu tập tin đã có thì
nối thêm Nếu chưa thì tạo tập tin mới.
“b” Mở tập tin kiểu nhị phân (binary)
“t” Mở tập tin kiểu văn bản (text)
Trang 12printf(“Khong mo duoc tap tin.”);
perror (“Ly do\n”);
Trang 13Để đóng tất cả các File đang mở ta còn có thể dùng hàm:
int fclose (biến_tập_tin)
Trang 14 Ghi ký tự: (Làm việc với Text & Binary.)
int putc(int ch, FILE *fp);
int fputc(int ch, FILE *fp);
2 hàm này sẽ ghi vào file một ký tự có mã = ch%256 Nếu thành công trả về mã ký tự được ghi, ngược lại trả về
EOF
Trang 15 Đọc ký tự từ File: (Làm việc với Text & Binary )
int getc(FILE *fp);
int fgetc(FILE *fp);
Hàm đọc một ký tự từ File fp, nếu thành công hàm cho
mã của ký tự đọc được, ngược lại trả về EOF
Ví dụ: char c = fgetc (fp);
Trang 16 Ghi chuỗi ký tự: (Làm việc với Text )
Đọc chuổi (dãy) ký tự từ File: (Làm việc với Text )
int fputs(const char *s, FILE *fp);
Hàm sẽ ghi chuỗi s lên File fp nếu thành công trả về ký tự
cuối cùng được ghi vào File, ngược lại trả về EOF
char *fgets(char *s, int n, FILE *fp);
Hàm sẽ đọc một dãy ký tự từ File fp vào vùng nhớ s, kết thúc khi đủ n-1 ký tự hoặc gặp ký tự xuống dòng nếu thành công hàm trả về địa chỉ vùng nhận kết quả, ngược lại trả về
NULL
Trang 17 Ghi dữ liệu theo khuôn dạng: (Làm việc với Text )
Với control chứa địa chỉ của chuỗi điều khiển (giống như
trong hàm printf), là danh sách các đối mà giá trị của chúng cần ghi vào File
Ví dụ:
int fprintf(FILE *fp, const char *control, );
FILE *fp; int a=777
fp = fopen (“taptin.txt”, “wt”);
if (fp!=NULL)
fprintf(fp, “%d\n”,a );
Trang 18char s[]=“Nguyen Van A”; float dtb = 8.5;
//ghi du lieu len tap tin
Trang 19 Đọc dữ liệu theo khuôn dạng: (Làm việc với Text )
Với control chứa địa chỉ của chuổi điều khiển (giống như trong
hàm scanf), là danh sách các đối chứa kết quả đọc được từ File
Ví dụ:
int fscanf(FILE *fp, const char *control, );
FILE *fp; int a;
fp = fopen (char *tentaptin, “wt”);
if (fp!=NULL && feof!=NULL)
fscanf(fp, “%d”,&a );
Trang 21Ta có một file text (sinhvien.txt) chứa thông tin các sinh viên, được định dạng như sau:
< MSSV > -< HoTen > ( < Nam/Nu > )tab < NTNS > tab < DTB >
Trang 22printf("%s\n(%s)\n%s\n%.2f",sv.MSSV,sv.gioitinh,sv.ntns,sv.dtb);
}
Trang 23 Ghi một số nguyên : (Làm việc với Binary )
Nếu thành công hàm trả về số nguyên được ghi , ngược lại trả
Trang 25 Ghi các mẫu tin lên File:
Với pt là con trỏ trỏ tới vùng nhớ chứa dữ liệu cần ghi, siz e
là kích thước của mẫu tin (byte), n làsố mẫu tin, fp là con trỏ File
Hàm sẽ ghi n mẫu tin kích thước size byte từ vùng nhớ pt lên File fp
Hàm trả về một giá trị = số mẫu tin thực sự được ghi.
int fwrite( void *pt, int size, int n, File *fp);
Trang 26 Đọc các mẫu tin từ File:
Với pt là con trỏ trỏ tới vùng nhớ chứa dữ liệu đọc được, size
là 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ẽ đọc n mẫu tin kích thước size byte từ File fp vào
vùng nhớ pt
Hàm trả về một giá trị = số mẫu tin thực sự đọc được.
Các hàm fread , fwrite thường dùng để đọc ghi các đối tượng có cùng độ lớn như cấu trúc, số thực
int fread( void *pt, int size, int n, File *fp);
Trang 27Ví dụ: Ghi cấu trúc của sinh viên
void GhiSV (SV *&sv){
printf("%s\t%s\n",(sv+i)->mssv, (sv+i)->ten);
fwrite(sv,sizeof(SV),n,f);
fclose(f); }
Trang 28Ví dụ: Đọc cấu trúc sinh viên
buffer = (SV*) malloc (1*sizeof(SV));
result = 0; int count=0;
Trang 29if(result == l/sizeof(SV))
printf("Thanh cong, doc duoc %d cau truc\n", result);
else {
printf("Qua trinh doc loi\n");
printf("Doc duoc %d cau truc\n", result);
} free (buffer);
}
fclose (f);
}
Trang 30Thanh cong tra ve 0;
Vd: remove(“C:\\WINDOWS\\regedit.exe”);
Đổi tên tập tin
ten_tap_tin_cu: khai báo đường dẫn như fopen
ten_tap_tin_moi: không cần đường dẫn, mặc định cùng
chung thư mục với tập tin cũ
Trả về 0 nếu thành công
Vd: rename(“C:\\WINDOWS\\regedit.exe”,”hehe.txt”);
int rename(“ten_tap_tin_cu”, “ten_tap_tin_moi”);
int remove(“ten_tap_tin_can_xoa”);
Trang 31 Làm sạch vùng đệm của các File đang mở
Nếu thành công hàm trả về giá trị số tệp đang mở, ngược lại trả vè EOF
Làm sạch vùng đệm File fp
Thành công cho giá trị 0, ngược lại cho giá trị EOF
int fflush(FILE *fp);
int flushall(void);
Trang 32 In chuổi s và thông báo lỗi hệ thống
Dùng kiểm tra lỗi thao tác trên File fp
Hàm trả về giá trị khác 0 nếu có lỗi, ngược lại trả về 0
int ferror(FILE *fp);
void perror(const char *s);
Xoá một File trên đĩa
Nếu thành công hàm cho giá trị 0, ngược lại trả về EOF
int unlink(const char *filename);
Trang 33 Dời con trỏ tập tin đi so_byte tính từ vt_bat_dau.
Chuyển con trỏ chỉ vị của File fp về đầu File
void rewind(FILE *fp);
int fseek(FILE *fp, long so_byte, int vt_bat_dau);
Trang 34Trả về vị trí hiện tại của con trỏ chỉ vị (byte) được tính từ 0 Nếu có lỗi hàm trả về -1L
long ftell(FILE *fp);
Trang 35 Quay lại vị trí đánh dấu sau khi
đánh dấu bằng hàm fgetpos
Đánh dấu trên tập tin
“stdio.h”
*vitri là biến con trỏ lưu vị trí
đánh dấu trên tập tin
fgetpos(FILE* f, fpos_t *vitri);
fsetpos(FILE* f, fpos_t *vitri)
Trang 361 Viết chương trình đọc tập tin văn bản có cấu trúc là một
ma trận vuông (n*n) :
Dòng đầu lưu giá trị n
Các dòng tiếp theo là mỗi dòng của ma trận Hai số kề
nhau được lưu bởi khoảng trắng
2 Viết chương trình ghép 2 tập tin văn bản (nội dụng tập
tin thứ hai ghép được ghép vào tập tin thứ nhất).
Trang 373 Viết chương trình đề nhập thêm dữ liệu cho mẫu tin của
một sinh viên vào cuối tập tin nhị phân chỉ chứa mẫu tin sinh viên.
4 Viết chương trình đọc dữ liệu từ tập tin chứa các mẫu tin
là thông tin của sinh viên Sau đó sắp xếp lại các mẫu tin theo các thông tin.
5 Viết chương trình tìm xem trong tập tin gồm các mẫu tin
SINHVIEN xem có sinh viên nào có MSSV là một mã
đã cho trước không
6 Viết chương trình sửa ngày sinh của một sinh viên có
MSSV được cho trước.