8.1. Khái niệm:
Cách khai báo: FILE *f; 8.2. Lọai File:
Có 2 loại file:
Tập tin văn bản (text file, ASCII file): *.C, *.PAS
Tập tin nhị phân (binary file): *.COM, *.EXE, *.DOC, *.XLS, *BMP, *PCX, *.GIF,…
8.3. Các thao tác trên file:
Muốn sử dụng file thực hiện qua 3 bước cơ bản:
Mở file (fopen)
Đọc hay ghi thông tin lên file (fread, fscanf, fwrite, fprintf)
Đóng file (fclose)
8.3.1. Mở file :
FILE *fopen(const char *têntậptin,const char *kiểu);
Ví dụ: FILE *f; f = fopen(“c:\\temp\\data.txt”, “wt”); if (f!= NULL) { // xử lý file được } fclose(f);
Kiểu Ý nghĩa
“r” “rt” Mở tập tin để đọc theo kiểu văn bản. Tập tin phải có trên đĩa nếu không sẽ có lỗi.
“w” “wt” Mở tập tin để ghi theo kiểu văn bản. Nếu tập tin đã có trên đĩa sẽ bị xóa. “a” “at” Mở tập tin để ghi bổ sung theo kiểu văn bản. Nếu tập tin chưa có thì tạo mới. “r+” “r+t” Mở tập tin để đọc/ghi theo kiểu văn bản. Tập tin phải có trên đĩa nếu không
sẽ có lỗi. “w+”
“w+t”
Mở tập tin để đọc/ghi theo kiểu văn bản. Nếu tập tin đã có trên đĩa sẽ bị xóa. “a+”
“a+t” Mở tập tin để đọc/ghi bổ sung theo kiểu văn bản. Nếu tập tin chưa có thì tạo mới. “rb” Mở tập tin để đọc theo kiểu nhị phân. Tập tin phải có trên đĩa nếu không sẽ
có lỗi.
“wb” Mở tập tin để ghi theo kiểu nhị phân. Nếu tập tin đã có trên đĩa sẽ bị xóa. “ab” Mở tập tin để ghi bổ sung theo kiểu nhị phân. Nếu tập tin chưa có thì tạo mới. “r+b” Mở tập tin để đọc/ghi theo kiểu nhị phân. Tập tin phải có trên đĩa nếu không
sẽ có lỗi.
“w+b” Mở tập tin để đọc/ghi theo kiểu nhị phân. Nếu tập tin đã có trên đĩa sẽ bị xóa.
“a+b” Mở tập tin để đọc/ghi bổ sung theo kiểu nhị phân. Nếu tập tin chưa có thì tạo mới. 8.3.2. Đóng file: int fclose(FILE *f) int fcloseall(void) 8.3.3. Xóa rác trong vùng đệm: int fflush(FILE *f) int flushalll(void)
8.3.4. Xóa file trên đĩa:
int unlink(const char *tên_tập_tin)
8.3.5. Đổi tên tập tin:
int rename(const char *tên_cũ,const char *tên_mới)
8.3.6. Kiểm tra kết thúc file:
int feof(FILE *f)
8.4. Các hàm nhập xuất trên tập tin:
8.4.1. Nhập xuất ký tư ï : (Dùng cho kiểu nhị phân và văn bản)
Ghi ký tự lên tập tin:
int putc(int ch, FILE *f) int fputc(int ch, FILE *f)
int getc( FILE *f) int fgetc( FILE *f)
8.4.2. Nhập xuất chuỗi : (Dùng cho kiểu văn bản)
Ghi một chuỗi:
int fputs(const char *s, FILE *f)
Đọc một chuỗi:
char *fgets(const char *s, int n, FILE *f)
8.4.3. Đọc ghi dữ liệu vào file văn bản:
Ghi dữ liệu vào file văn bản:
int fprintf(FILE *f , const char *đặc tả,< danh sách biến>);
Đọc dữ liệu vào file văn bản:
fscanf(FILE *f , const char *đặc tả,<danh sách biến>);
8.4.4. Đọc ghi số nguyên : (Dùng cho kiểu nhị phân)
Ghi một số nguyên:
int putw(int n, FILE *f)
Đọc một số nguyên:
int getw(FILE *f)
8.4.5. Đọc ghi cấu trú c : (Dùng cho kiểu nhị phân)
Ghi mẫu tin lên tập tin:
int fwrite(void *ptr, int size, int n, FILE *f)
Đọc mẫu tin lên tập tin:
int fread(void *ptr, int size, int n, FILE *f)
8.5. Các hàm di chuyển con trỏ tập tin:8.5.1. Đưa con trỏ về đầu tập tin : 8.5.1. Đưa con trỏ về đầu tập tin :
void rewind(FILE *f)
8.5.2. Dời con trỏ tập tin :
int fseek(FILE *f, long số_byte, int vt_bắt_đầu)
Nếu :
số_byte >0 chuyển xuống dưới, số_byte <0 chuyển ngược lên số_byte=0 đứng tại vt_bắt_đầu, vt_bắt_đầu có thể mang một trong các giá trị sau:
SEEK_SET (0) : Vị trí đầu tập tin
SEEK_CUR (1): Vị trí hiện hành
SEEK_END (2): Vị trí cuối tập tin.
8.5.3. Cho biết vị trí hiện tại của con trỏ:
long ftell(FILE *f)
8.6. Ví dụ minh họa:
Ví dụ 8.1:
/* Tạo, mở một file và nhập một kí tự vào file */
#include <stdio.h> main( )
{
FILE *pf;
putc('C', pf); fclose(pf); }
Ví dụ 8.2:
/*Mở một File đã tồn tại trên đĩa để đọc*/
#include <stdio.h> main( ) { FILE *pf; char fch; pf = fopen("MYFILE.DTA","r"); fch = getc(pf); printf("Kí tự là %c\n", fch); fclose(pf); } Ví dụ 8.3:
/*Chương trình minh họa cách nhập một chuỗi kí tự vào file*/
#include <stdio.h> main( ) { FILE *pf; char fch; pf = fopen("MYFILE.DTA","w"); while((fch = getche( )) != '\r') fch = putc(fch, pf); fclose(pf); } Ví dụ 8.4:
/*Đọc một chuỗi kí tự từ file đã tồn tại trên đĩa*/
#include <stdio.h> main( ) { FILE *pf; char fch; pf = fopen("MYFILE.DTA","r"); while((fch = getc(pf)) != EOF) printf("%c", fch);
fclose(pf);
} Ví dụ 8.5:
/*Khởi tạo, nhập, xuất dữ liệu trên file */ #include <stdio.h> main( ) { char selection[2]; char file_name[13]; char user_choice[2]; int selection_value; int file_character; FILE *file_pointer;
printf("Chọn một trong các mục sau:\n");
printf("1] Tạo một File mới. 2] Viết đè lên một file đã tồn tại.\n"); printf("3] Cộng thêm dữ liệu mới đến file đã tồn tại.\n");
printf("4] Nhập dữ liệu từ file đang tồn tại.\n"); do { printf("Lựa chọn của bạn => "); gets(user_choice); selection_value = atoi(user_choice); switch(selection_value) { case 1 :
case 2 : strcpy(selection, "w"); break; case 3 : strcpy(selection, "a"); break; case 4 : strcpy(selection, "r"); break; default : {
printf("Điều này không được chọn.\n"); selection_value = 0;
} }
} while(selection_value == 0);
printf("Nhập tên của file => "); gets(file_name);
if((file_pointer = fopen(file_name, selection)) == NULL) {
printf("Khong the mo duoc file %s!", file_name); exit(-1); } switch(selection_value) { case 1 : break; case 2 :
case 3 : {printf("Vào chuỗi để lưu: \n");
file_character = putc(file_character, file_pointer); }
break;
case 4 : {while((file_character = getc(file_pointer)) != EOF) printf("%c", file_character); } break; } fclose(file_pointer); } Ví dụ 8.6:
/*Chương trình minh họa con trỏ file và kiểu cấu trúc*/
#include <stdio.h> typedef struct { char part_name[15]; int quantity; float cost_each; } parts_structure; main( ) { parts_structure parts_data; FILE *file_pointer; file_pointer = fopen("B:PARTS.DTA","wb"); do { printf("\nName of part => "); gets(parts_data.part_name); printf("Number of parts => "); scanf("%d", &parts_data.quantity); printf("Cost per part => ");
scanf("%f", &parts_data.cost_each);
fwrite(&parts_data, sizeof(parts_data), 1, file_pointer); printf("Add more parts (y/n)? => ");
} while (getche( ) == 'y'); fclose(file_pointer); }