Khi chưa thao tác với tệp tin, chúng ta đã sử dụng một số hàm printf và scanf cho công việc nhập xuất thông tin từ bên ngoài vào chương trình. Đến bài này, chúng ta đã hoàn toàn thực hiện thao tác với tệp tin và cũng cần một số hàm để thực hiện việc thao tác nhập xuất thông tin, dữ liệu vào tệp tin.

1.Hàm fprintf ghi dữ liệu vào file

Hàm fprintf() chức năng là giống như printf() nhưng thay vì ghi dữ liệu vào giao diện điều khiển, nó viết định dạng dữ liệu vào tập tin.

Hầu như tất cả các đối số của fprintf() hàm đều giống như printf() ngoại trừ nó có một đối số bổ sung là con trỏ tệp đến tệp nơi đầu ra được định dạng sẽ được ghi.

Khi thực hiện thành công, nó trả về tổng số ký tự được ghi vào tệp. Khi có lỗi, nó sẽ trả về EOF.

Cú pháp:

fprintf(FILE *fp, const char *format [, argument, ...] );

Trong đó:

  • FILE *fp là con trỏ có kiểu file (con trỏ này thực hiện mở file với các mode)
  • format là những định dạng (như %d, %f, %s….)
  • argument là những tham số truyền vào theo định dạng

Để dễ hình dung hơn, ở ví dụ dưới đây tôi sử dụng hàm fprintf để thực hiện việc ghi dữ liệu tên và tiêu đề vào file laptrinhtudau.txt. (Dữ liệu được ghi vào fiile này là được lưu trữ trong các biến char tenchar tieu_de)

File ban đầu laptrinhtudau.txt là một file rỗng. Thực thi chương trình dưới đây và nhận được kết quả:

#include<stdio.h>
int main()
{
    //khai bao du lieu ten va tieu de
    char ten[25] = "Laptrinhtudau.com";
    char tieu_de[50] = "Hoc lap trinh tu con so 0";
    //con tro file
    FILE *fp;
    //mo file voi mode a de chen du lieu vao cuoi file
    fp = fopen("laptrinhtudau.txt", "a");
    //thuc hien in du lieu vao file laptrinhtudau.txt
    fprintf(fp, "\n%s \n%s", ten, tieu_de);
    //dong file
    fclose(fp);
    return 0;
}

Kết quả mở tập tin laptrinhtudau.txt là:

Chú ý: Ở chương trình trên tôi thực hiện open file laptrinhtudau.txt theo mode a, nghĩa là mở file lên và đặt con trỏ chuột vào dòng cuối cùng của file. Khi tôi thực hiện chương trình nhiều lần sau này các thông tin dữ liệu sẽ được ghi vào cuối file đó! Đối với Mode a trong trường hợp file không tồn tại, chương trình sẽ tự tạo ra file laptrinhtudau.txt để thực hiện công việc.

Ví dụ tôi thực hiện chạy chương trình trên thêm một lần nữa, dữ liệu sẽ được nạp thêm một lần vào cuối file đó và kết quả sẽ là:

Một ví dụ khác, tôi cần nhập N thông tin (họ tên, tuổi, lương) do người dùng nhập từ bàn phím vào hàm scanf sau đó tôi dùng fprintf để ghi vào file thongtin.txt

#include<stdio.h>
int main()
{
    //khai bao cac bien
    char hoten[25];
    int tuoi;
    float luong;
    int n;
    printf("Nhap N: ");
    scanf("%d", &n);
    //con tro file
    FILE *fp;
    //mo file voi mode a de chen du lieu vao cuoi file
    fp = fopen("thongtin.txt", "a");
    //nhap va in cac thong tin thu i vao file
    for(int i = 0; i < n; i++){
        //nhap du lieu vao cac bien
        printf("Nhap ho ten: ");
        fflush(stdin);
        gets(hoten);
        printf("Nhap tuoi: ");
        scanf("%d", &tuoi);
        printf("Nhap luong: ");
        scanf("%f", &luong);
        printf("\n");
        //thuc hien in du lieu thu i vao file thongtin.txt
        fprintf(fp, "Ho ten: %s\t Tuoi: %d\t Luong: %f\n", hoten, tuoi, luong);
    }
    printf("NHAP THONG TIN VAO FILE THANH CONG!")
    //dong file
    fclose(fp);
}
Nhap N: 2

Nhap ho ten: Nguyen Van A

Nhap tuoi: 20

Nhap luong: 100000

Nhap ho ten: Nguyen Van B

Nhap tuoi: 21

Nhap luong: 500000

NHAP THONG TIN VAO FILE THANH CONG!

File thongtin.txt ban đầu là rỗng, sau khi thực hiện chương trình trên tôi nhận được kết quả sau:

open theo mode a nên khi cần thêm dữ liệu mới vào file thongtin.txt tôi chỉ việc chạy lại chương trình trên và nhập dữ liệu mới vào (dữ liệu sẽ được thêm vào cuối file).

2.Hàm fscanf đọc dữ liệu từ file

Hàm fscanf() được sử dụng để đọc đầu vào định dạng từ file. Nó hoạt động giống như scanf() nhưng thay vì đọc dữ liệu từ bàn phím, nó lại sử dụng để đọc dữ liệu từ tệp.

Các đối số truyền vào hàm fscanf() cũng giống như hàm fprintf().

Khi thực hiện hàm thành công, hàm này trả về số lượng giá trị đã đọc và khi bị lỗi hoặc kết thúc tệp bất thường, nó trả về EOF hoặc -1.

Cú pháp:

fscanf(FILE *fp, const char *format [, argument, ...] );

Các đối số truyền vào hàm tương đương với fprintf mà ở trên tôi đã nêu ra vì thế tôi sẽ không giải thích lại.

Ở phần hàm fscanf này tôi sẽ đi trực tiếp vào ví dụ dưới đây:

Tôi sử dụng hàm fscanf để đọc các thông tin là các số nguyên (từ 1->9) có kiểu int mà tôi vừa ghi vào file soluong.txt:

Trước khi đọc thông tin thì tôi cần dùng hàm fprintf để ghi thông tin là các số từ 1->9 vào file soluong.txt trước:

#include <stdio.h>
int main()
{
   //tao bien n, va bien number 
   int n, number;
   //con tro file
   FILE *fp;
   //mo file voi mode w de ghi du lieu vao file
   fp = fopen("soluong.txt","w");
   printf("Nhap N: ");
   scanf("%d", &n);
   //nhap du N du lieu vao file bang fpirntf
   for(int i = 0; i < n; i++){
        printf("Nhap so: ");
        scanf("%d",&number);
        //ghi du lieu thu i vao file
        fprintf(fp,"%d",number);
   }
   printf("GHI THANH CONG!");
   //dong file
   fclose(fp);
   return 0;
}
Nhap N: 9

Nhap so: 1

Nhap so: 2

Nhap so: 3

Nhap so: 4

Nhap so: 5

Nhap so: 6

Nhap so: 7

Nhap so: 8

Nhap so: 9

GHI THANH CONG!

Ban đầu file soluong.txt là rỗng, file thongtin.txt sau khi thực hiện chương trình trên có kết quả là:

Sau khi đã có các số từ 1->9 ở trong file soluong.txt tôi sẽ sử dụng hàm fscanf để đọc các số đó ra trong chương trình C:

#include <stdio.h>
int main()
{
   //tao number
   int number;
   //con tro file
   FILE *fp;
   //mo file voi mode r de doc du lieu tu file
   fp = fopen("soluong.txt","r");
   //su dung fscanf de doc du lieu tu file va gan cho bien number
   fscanf(fp,"%d",&number);
   // in du  lieu vua doc ra man hinh
   printf("%d", number);
   //dong file
   fclose(fp);
}
123456789

Chú ý: Việc đọc dữ liệu ra chương trình C bằng hàm fscanf không hề làm thay đổi hay làm mất dữ liệu có trong file soluong.txt!