Bài giảng Ngôn ngữ lập trình C - Dữ liệu kiểu tệp
Mục đích
Biết các thao tác xử lý tệp như tạo tệp,
đọc ghi tệp
Xử lý tệp truy cập tuần tự
Xử lý tệp truy cập ngẫu nhiên
Tóm tắt nội dung Bài giảng Ngôn ngữ lập trình C - Dữ liệu kiểu tệp, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
NGÔN NGỮ LẬP TRÌNH C
Dữ liệu kiểu tệp
Ninh Thị Thanh Tâm
Khoa CNTT – HV Quản lý Giáo dục
Mục đích
Biết các thao tác xử lý tệp như tạo tệp,
đọc ghi tệp…
Xử lý tệp truy cập tuần tự
Xử lý tệp truy cập ngẫu nhiên
Nội dung
Khái niệm về tệp
Các hàm vào ra tệp cơ bản
Các hàm thao tác vào ra tệp mức thấp
Khái niệm về tệp
Đường dẫn truy cập các tệp
Thẻ tệp (file handle)
Các thông tin về tệp
Các kiểu vào ra với tệp
Khái niệm về tệp
Đường dẫn truy cập các tệp
Tên ổ đĩa
Tên các thư mục
Tên tệp
Phần mở rộng
Thẻ tệp (file handle)
Là một số nguyên hệ điều hành trả lại khi tạo
hay mở tệp
Dùng để truy cập đến một cấu trúc lưu trữ các
thông tin cần thiết cho các thao tác với tệp
Khái niệm về tệp
Các thông tin về tệp
Các thuộc tính của tệp đã mở
Kích thước và trạng thái tệp
Chế độ truyền: nhị phân và văn bản
Các kiểu vào ra với tệp
Các hàm vào ra theo dòng qua vùng đệm
Các hàm vào ra tệp mức thấp, không qua
vùng đệm
Các hàm vào ra tệp cơ bản
Đưa con trỏ về đầu tệprewind()
Trả về giá trị khác 0 nếu có lỗi xuất hiện trong thao tácferror()
Trả về giá trị khác 0 nếu con trỏ ở cuối tệpfeof()
ghi ra tệp nội dung trên vùng đệmfflush()
Nhập dữ liệu từ tệpfscanf()
Ghi lên tệpfprintf()
Di chuyển con trỏ tệp đến một byte được chỉ địnhfseek()
Đọc một kí tự từ tệpgetc()
Ghi một kí tự lên tệpputc()
Đóng tệpfclose()
Mở tệpfopen()
Chức năngTên hàm
Con trỏ tệp
Là một con trỏ kiểu FILE
Chỉ đến vùng nhớ chứa các thông tin liên
quan đến tệp
Tên tệp
Tình trạng
Vị trí đang làm việc
Con trỏ tệp
Mở tệp theo kiểu nhị phân“b”
Mở tệp theo kiểu văn bản“t”
Mở một tệp để ghi vào cuối tệp“a+”
Mở một tệp mới để đọc và ghi, nội dung bị xóa nếu tệp
tồn tại
“w+”
Mở tệp để đọc và ghi, fopen trả lại lỗi nếu tệp không tồn
tại
“r+”
Mở tệp để ghi thêm vào cuối tệp“a”
Mở tệp để ghi, nếu tệp đã tồn tại, nội dung sẽ bị xóa“w”
Mở tệp để đọc, trả lại lỗi nếu tệp không tồn tại“r”
Ý nghĩaChế độ
Hàm fopen()
Mở tệp
Hàm nguyên mẫu:
FILE *fopen(const char *filename, const char *mode);
filename là xâu kí tự gồm tên tệp và đường
dẫn tới tệp
mode là trạng thái làm việc của tệp sau khi
mở
Kết quả
NULL nếu thất bại
Con trỏ tệp nếu mở tệp thành công
Ví dụ
fp = fopen("readme.txt","rt");
if (fp==NULL){
printf("Khong mo duoc tep");
exit(0);
}
Hàm putc()
Ghi một kí tự lên tệp đã được mở
Hàm nguyên mẫu:
int putc(int ch, FILE *fp)
fp là con trỏ tệp trả về trong thao tác mở tệp
ch là kí tự cần ghi lên tệp
Kết quả
Thành công: trả lại kí tự vừa ghi được
Thất bại: trả lại EOF
Hàm getc()
Đọc một kí tự từ tệp đã được mở
Hàm nguyên mẫu:
int getc(FILE *fp)
fp là con trỏ tệp trả về trong thao tác mở tệp
Kết quả
Thành công: trả lại kí tự vừa đọc được
Thất bại: trả lại EOF
Ví dụ
Đọc đến cuối tệp văn bản
ch = getc();
while (ch!=EOF) {
ch = getc(fp);
...
}
Đọc tệp nhị phân khi gặp kí tự kết thúc tệp
while (!feof(fp))
ch = getc(fp);
Hàm fclose()
Đóng tệp đã được mở
Hàm nguyên mẫu:
int fclose(FILE *fp)
fp là con trỏ tệp trả về trong thao tác mở tệp
Kết quả
Thành công: trả lại 0
Thất bại: trả lại EOF
Ví dụ - sao chép tệp
/*filecopy.c*/
#include
#include
void main(){
FILE *fin, *fout;
char ch;
fin = fopen("filecopy.c","rb");
if (fin == NULL) {
printf("Khong mo duoc tep nguon\n");
exit(1);
}
fout = fopen("fout.dat", "wb");
if (fout==NULL){
printf("Khong mo duoc tep dich\n");
exit(1);
}
while (!feof(fin))
putc(getc(fin), fout);
fclose(fin);
fclose(fout);
}
Hàm ferror()
Kiểm tra thao tác truy xuất trên tệp trước
đó có lỗi hay không
Hàm nguyên mẫu
int ferror(FILE *fp);
Kết quả
Bằng 0, nếu thao tác trước đó không có lỗi
Khác 0, ngược lại
Hàm rewind()
Đưa con trỏ về đầu tệp
Hàm nguyên mẫu
int rewind(FILE *fp);
Hàm getw() và putw()
Đọc/ghi các số nguyên 2 byte
Hàm nguyên mẫu
int getw(FILE *fp);
int putw(int w, FILE *fp);
Hàm fgets() và fputs()
Đọc/ghi các chuỗi kí tự
Hàm nguyên mẫu
char *fgets(char *str, int num, FILE *fp);
char *fputs(char *str, FILE *fp);
Hàm fread() và fwrite()
Đọc/ghi các khối dữ liệu
Hàm nguyên mẫu
int fread(void *buffer, int so_byte, int
so_muc, FILE *fp);
int fwrite(void *buffer, int so_byte, int
so_muc, FILE *fp);
Ví dụ
Nhập tên tệp văn bản; đọc và in nội dung
lên màn hình
/*readfile.c*/
#include
#include
void main(){
FILE *fp;
char filename[50];
char w[300];
printf("Nhap ten tep:");
gets(filename);
fp = fopen(filename,"r");
if (!fp){
printf("Khong mo duoc tep nguon\n");
exit(1);
}
while (fgets(w,300,fp))
puts(w);
fclose(fp);
getch();
}
Ví dụ
Lập một tệp văn bản in lại 50 số nguyên tố
đầu tiên, mỗi dòng 10 số. Đọc và in nội
dung tệp.
/*filent.c*/
#include
#include
int ktnt(int);
void laptep(char *);
void doctep(char *);
void main(){
int chon;
printf("Lap tep go 1, doc tep go 0\n");
scanf("%d",&chon);
if (chon==1)
laptep("nto.dat");
if (chon==0)
doctep("nto.dat");
getch();
}
int ktnt(int k){
int i;
if (k==1||k==0)
return 0;
for (i=2; i<k; i++)
if (k%i==0)
return 0;
return k>1;
}
void laptep(char *filename){
FILE *f;
int i;
int k = 2;
f = fopen(filename,"w");
if (!f){
printf("Khong tao duoc tep.\n");
exit(1);
}
for (i=1; i<=50; i++){
while (!ktnt(k)) k++;
fprintf(f,"%6d",k);
if(i%10==0)
fprintf(f,"\n");
k++;
}
fclose(f);
}
void doctep(char *filename){
FILE *f;
int x;
f = fopen(filename,"r");
if (!f){
printf("Khong mo duoc tep\n");
exit(1);
}
while (!feof(f)){
fscanf(f,"%d",&x);
printf("%5d",x);
}
fclose(f);
}
Ví dụ
Lập trực tiếp một tệp văn bản ghi một ma
trận số thực
Dòng 1: ghi thông báo
Dòng 2: ghi số hàng, số cột của ma trận
Lập chương trình: đọc tệp văn bản và
nhập ma trận vào bộ nhớ động. In ma trận
vào tệp
/*filemt.c*/
#include
#include
int n, m;
float *nhap(char *);
float shang(float *, int);
float scot(float *, int);
void inmt(float *);
void ghitep(float *, char *);
void main(){
float *a;
char *tep1 = "mt.dat";
char *tep2 = "luu.dat";
clrscr();
a = nhap(tep1);
inmt(a);
ghitep(a,tep2);
getch();
}
float *nhap(char *tep){
float *x, *p;
char w[300];
FILE *f;
f = fopen(tep, "r");
if (!f){
printf("Khong mo duoc tep.\n");
exit(1);
}
fscanf(f,"%d%d ",&n,&m);
x = (float*)calloc(m*n,sizeof(float));
if (!x){
printf("Loi cap phat bo nho.\n");
getch();
exit(1);
}
for (p=x; p<x+n*m; p++)
fscanf(f,"%f ", p);
fclose(f);
return x;
}
float shang(float *x, int k){
float s = 0;
int j;
for (j=0; j<m; j++)
s = s + x[k*m+j];
return s;
}
float scot(float *x, int k){
float s = 0;
int i;
for (i=0; i<n; i++)
s = s + x[i*m+k];
return s;
}
void inmt(float *x){
int i, j;
for (i=0; i<n; i++){
for (j=0; j<m; j++)
printf("%5.1f",*(x+i*m+j));
printf("\n");
}
void ghitep(float *x, char *tep){
FILE *f;
int i, j;
f = fopen(tep, "w");
if (!f){
printf("Loi mo tep.\n");
exit(0);
}
fprintf(f,"Ma tran ket qua\n");
fprintf(f,"%d\t%d\n",n,m);
for (i=0; i<n; i++){
for (j=0; j<m; j++)
fprintf(f,"%5.1f",x[i*m+j]);
fprintf(f,"%5.1f\n",shang(x,i));
}
fprintf(f,"\n");
for(j=0; j<m; j++)
fprintf(f,"%5.1f",scot(x,j));
fclose(f);
}
File đính kèm:
Bài giảng Ngôn ngữ lập trình C - Dữ liệu kiểu tệp.pdf

