Bài 12: Đọc ghi file trong C – Học lập trình C cơ bản

Đăng bởi : Admin | Lượt xem : 3361 | Chuyên mục : C / C + +

Ở bài này tất cả chúng ta sẽ thấy cách lập trình viên tạo, mở và đóng những file văn bản hoặc file nhị phân với những tài liệu tàng trữ .

Một file biểu diễn một chuỗi các bytes, không kể đó là file văn bản hay file nhị phân. Ngôn ngữ lập trình C cung cấp các hàm truy cập mức độ cao cũng như thấp (mức hệ điều hành) để thao tác với file trên thiết bị lưu trữ. Chương này sẽ đưa bạn đến những cách gọi hàm quan trọng cho việc quản lý file.

1. Mở file trong C

Bạn có thể sử dụng hàm fopen() để tạo file mới hoặc để mở các file đã tồn tại. Cách gọi này sẽ khởi tạo đối tượng loại FILE, mà bao gồm thông tin cần thiết để điều khiển luồng. Dưới đây là một cách gọi hàm:  

FILE *fopen( const char * ten_file, const char * che_do );

  Ở đây, ten_file là một chuỗi, được coi như tên file và giá trị che_do truy cập có thể là những giá trị dưới đây:  

Nếu bạn thao tác với những file nhị phân, bạn hoàn toàn có thể có những cách truy xuất thay cho những trường hợp trên như sau :

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

2. Đóng file trong C

Để đóng 1 file bạn có thể sử dụng hàm fclose() dưới đây:  

int fclose( FILE *fp );

Hàm fclose( ) trả về giá trị zero nếu thành công hoặc EOF nếu có lỗi trong quá trình đóng file. Hàm này thực tế xóa các dữ liệu trong bộ đệm đối với file, đóng file và giải phóng bộ nhớ được sử dụng với file. EOF là một hằng số được định nghĩa trong phần stdio.h.

Có nhiều hàm phong phú được phân phối bởi thư viện chuẩn của ngôn từ C để đọc và ghi từng ký tự và trong một dạng với số lượng ký tự cố định và thắt chặt. Chúng ta sẽ xem xét trong ví dụ sau đây :

3. Ghi tới một file trong C

Dưới đây là hàm đơn thuần nhất để thực thi việc ghi những ký tự riêng tới một luồng :

int fputc( int c, FILE *fp );

Hàm fputc() ghi các ký tự với giá trị tham số c đến một luồng ra tham chiếu bởi con trỏ fp. Nó sẽ trả về ký tự được ghi nếu thành công hoặc EOF nếu có lỗi. Bạn có thể sử dụng hàm sau đây để ghi một chuỗi kết thúc bằng ký tự null đến một luồng:  

int fputs( const char *s, FILE *fp );

Hàm fputs() ghi chuỗi s đến một luồng ra tham chiếu bởi fp. Nó trả về một giá trị không âm nếu thành công và trả về ký tự EOF nếu xảy ra một lỗi. Bạn có thể sử dụng hàm int fprintf(FILE *fp,const char *format, …) để ghi một chuỗi ra file. Thử ví dụ dưới đây:  

Bạn phải chắc như đinh bạn có thư mục / tmp, nếu không có, bạn phải tạo thư mục này trên máy bạn .

#include 

main()
{
   FILE *fp;

   fp = fopen("vidu.txt", "w+");
   fprintf(fp, "Vi du kiem tra ham fprintf ...\n");
   fputs("Vi du kiem tra ham fputs ...\n", fp);
   fclose(fp);
}

Khi đoạn code trên được biên dịch và thực hiện, nó tạo file mới là vidu.txt và ghi vào đó 2 dòng của 2 hàm khác nhau. Cùng đọc file này ở phần tiếp theo.  

4. Đọc file trong C

Dưới đây là hàm đơn thuần nhất để đọc một ký tự riêng rẽ từ file :

int fgetc( FILE * fp );

Hàm fgetc() đọc một ký tự từ một file tham chiếu bởi con trở fp. Giá trị trả về là ký tự đọc được nếu thành công, và trong trường hợp lỗi trả về EOF. Hàm dưới đây cho phép bạn đọc chuỗi từ một luồng:

char *fgets( char *buf, int n, FILE *fp );

Hàm fgets() đọc n-1 ký tự từ một luồng vào tham chiếu bởi fp. Nó copy chuỗi đọc đến bộ đệm buf, gán ký tự null vào kết thúc chuỗi.

Nếu hàm gặp phải một ký tự newline (dòng mới) (xuống dòng) ‘\n’ hoặc ký tự EOF trước khi đọc được số lượng tối đa các ký tự, nó sẽ chỉ trả về các ký tự cho đến ký tự xuống dòng và ký tự xuống dòng mới. Bạn có thể sử dụng hàm int fscanf(FILE *fp, const char *format, …) để đọc chuỗi từ một file, nhưng dừng việc đọc ở khoảng trắng đầu tiên gặp phải:

#include 

main()
{
   FILE *fp;
   char buff[255];

   fp = fopen("vidu.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);

}

5. Hàm Nhập – Xuất nhị phân trong C

Dưới đây là hai hàm, hoàn toàn có thể sử dụng cho việc input và output nhị phân :

size_t fread(void *ptr, size_t kich_co_cua_cac_phan_tu, 
             size_t so_phan_tu, FILE *ten_file);
              
size_t fwrite(const void *ptr, size_t kich_co_cua_cac_phan_tu, 
             size_t so_phan_tu, FILE *ten_file);

Cả 2 hàm trên được sử dụng để đọc và ghi những khối bộ nhớ, thường là những mảng hoặc cấu trúc .Như vậy, trải qua bài học kinh nghiệm này, mình đã trình làng đến những bạn những thao tác cơ bản với file trong C. Cảm ơn những bạn đã đọc .