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 ten và char 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:
Vì 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!