Trong bài này chúng ta sẽ tìm hiểu cách khai báo và sử dụng kiểu File trong ngôn ngữ C
Để nhập/xuất trên kiễu dữ liệu File trong C, ta sử dụng con trỏ kiểu FILE và được khai báo như sau :
FILE *fp;
C phân biệt File ra thành 2 loại là File văn bản (Text File) và File nhị phân (Binary File). Việc đọc, ghi trên 2 file này có một số khác biệt nhất định.
Tuy nhiên để làm việc kiểu dữ liệu File (văn bản hoặc nhị phân) trong ngôn ngữ C, ta đều phải thực hiện 3 công việc chính như sau:
- Mở File
- Thao tác gì đó với file (đọc file, ghi file…)
- Đóng File
Tiếp theo đây, ta sẽ làm quen với một số hàm làm việc trên kiểu dữ liệu file cơ bản của C
- Mở file: Để mở file, ta sử dụng hàm fopen có nguyên mẫu như sau:
FILE *fopen(const char *filename, const char *mode);Một số đối số File mode thường dùng:
- Đối với file văn bản:
r - Mở file để đọc (file cần đọc phải tồn tại) w - Mở file để ghi (nếu file đã tồn tại thì nó sẽ được xóa) a - Mở file để ghi bổ sung vào file (nếu file chưa tồn tại thì tạo file mới) r+ - Mở file để đọc và ghi (file cần đọc phải tồn tại) w+ - Mở file để đọc và ghi (nếu file đã tồn tại thì nó sẽ được xóa) a+ - Mở file để đọc và ghi bổ sung vào file (file cần đọc phải tồn tại)
- Đối với file nhị phân: Ta sử dụng các mode : r, w, a, r+b, w+b, a+b với cách sử dụng như các mode tương ứng của file văn bản
- Đối với file văn bản:
- Đóng file: Sau khi thao tác xong với File, ta sử dụng hàm fclose để đóng file lại. Nguyên mẫu của hàm fclose như sau:
int fclose(FILE *a_file);Hoặc ta cũng có thể sử dụng hàm int fcloseall(void); để đóng tất cả các file đang mở
- Hàm đọc/ghi trên file văn bản:
int fprintf ( FILE * stream, const char * format, ... ); int fputs ( const char * str, FILE * stream ); int fputc ( int character, FILE * stream ); int fscanf ( FILE * stream, const char * format, ... ); char * fgets ( char * str, int num, FILE * stream ); int fgetc ( FILE * stream );Cách sử dụng của những hàm này thì tương tự các hàm printf, scanf,.. (chỉ thêm 1 đối số là con trỏ file)
Ví dụ:
#include <stdio.h> #include <conio.h> int main () { char str [80]; float f; FILE * pFile; pFile = fopen ("myfile.txt","w+"); fprintf (pFile, "%f %s", 3.1416, "PI"); rewind (pFile); //Di chuyen den dau file fscanf (pFile, "%f", &f); fscanf (pFile, "%s", str); fclose (pFile); printf ("Du lieu doc duoc: %f and %s \n",f,str); return 0; } - Hàm đọc/ghi trên file nhị phân
- Hàm ghi file nhị phân fwrite
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); - Các đối số của hàm fwrite:
ptr: con trỏ trỏ tới vùng nhớ chứa dữ liệu size: kích thước của mẫu tin cần ghi count: số mẫu tin cần ghi stream: con trỏ file cần ghi
- Hàm đọc file nhị phân fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); - Các đối số của hàm fread:
ptr: con trỏ trỏ tới vùng nhớ chứa dữ liệu size: kích thước của mẫu tin cần đọc count: số mẫu tin cần đọc stream: con trỏ file cần đọc
- Ví dụ
char str[MAX]; int A[6] = {1, 2, 3, 4, 5, 6}; int a[6]; FILE *pfile; pfile = fopen("test.bin","wb+"); //Ghi file fwrite(A,sizeof(int),sizeof(A)/sizeof(int),pfile); printf("%d",sizeof(A)/sizeof(int)); //Dua con tro file ve dau file rewind(pfile); int spt = 0; int t; //Doc file while (fread(&t,sizeof(int),1,pfile)){ a[spt] = t; spt++; } for (int i = 0; i < spt; i++){ printf("%d ",a[i]); } fclose(pfile);
- Hàm ghi file nhị phân fwrite
- Hàm fseek
- Nguyên mẫu
int fseek ( FILE * stream, long int offset, int origin ); - Tác dụng: Di chuyển con trỏ file đến ví trí cần thiết
- Các đối số của hàm fseek:
stream: con trỏ file offset: số byte cần di chuyển (di chuyển về cuối file nếu offset > 0, di chuyển về đầu file nếu offset < 0) origin: vị trí bắt đầu dịch chuyển origin nhận 1 trong 3 giá trị
- SEEK_SET hay 0: xuất phát từ đầu file
- SEEK_CUR hay 1: xuất phát từ vị trí hiện tại
- SEEK_END hay 2: xuất phát từ cuối file
- Ví dụ
FILE * pFile; pFile = fopen ( "example.txt" , "w" ); fputs ( "This is an apple." , pFile ); fseek ( pFile , 9 , SEEK_SET ); fputs ( " sam" , pFile ); fclose ( pFile ); return 0;
- Nguyên mẫu
- Hàm feol
- Nguyên mẫu
int feof ( FILE * stream ); - Tác dụng: Kiểm tra con trỏ file đã tới cuối file hay chưa
- Ví dụ
FILE * pFile; long n = 0; pFile = fopen ("myfile.txt","rb"); if (pFile == NULL) perror ("File bi loi"); else { while (!feof(pFile)) { fgetc (pFile); n++; } fclose (pFile); printf ("Tong so byte: %d\n", n-1); } return 0;
- Nguyên mẫu
Hàm tương tác với tập tin trên PHP:
ReplyDelete- Hàm fread
- Hàm fopen
- Hàm fwrite