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

pdf33 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2266 | Lượt tải: 1download
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:

  • pdfBài giảng Ngôn ngữ lập trình C - Dữ liệu kiểu tệp.pdf