Ghi file trong C (fputc, fputs,fprintf)

Cùng tìm tòi về cách ghi file trong C. Bạn sẽ học được cách ghi file trong C bằng 3 hàm có sẵn là fputc, fputs, & fprintf sau bài học này.

Tất cả chúng ta có 3 mẹo để ghi file trong C như sau:

  • Ghi từng ký tự vào file bằng hàm fputc
  • Ghi từng dòng file trong C bằng hàm fputs
  • Ghi từng dòng file theo định dạng chỉ định bằng hàm fprintf

Nội dung này sẽ lưu tâm về cách Ghi file trong C. Về quy trình tổng quát giải quyết file trong C, hãy tìm hiểu tại bài sau:

  • Đọc thêm: Giải quyết file trong ͼ

Trước khi ghi file trong C

Để ghi file trong C, bạn cần phải mở nó trước bằng một trong hai hàm ghi file là fopen hoặc fopen_s mà Kiyoshi đã chỉ dẫn trong bài Mở file trong C.

Chú ý là tùy thuộc vào vào mục đích của việc ghi file mà mode dùng để mở file cũng sẽ khác nhau, thành ra tất cả chúng ta cần hết sức cảnh báo khi lựa chọn mode khi mở file.

Ở giai đoạn này, mode ghi file chính là thông tin về những việc cần làm với một file. Các mode có thể dùng để ghi file trong C như sau:

ModeXử lýChức năngwMở để ghi đèXoá bài viết cũ & ghi đè bài viết mới
Nếu file không tồn tại thì tạo file mớiaMở để ghi chènGhi chèn bài viết mới vào cuối file
Nếu file không tồn tại thì tạo file mớir+Mở để đọc & ghi đèCho phép cả đọc & ghi đè
Nếu file không tồn tại thì trả về NULLw+Mở để đọc & ghi đèCho phép cả đọc & ghi đè
Nếu file không tồn tại thì tạo file mớia+Mở để đọc & ghi chènCho phép cả đọc & ghi chèn
Nếu file không tồn tại thì tạo file mới

Chẳng hạn, nếu bạn chỉ mong muốn mở để ghi đè file, hãy dùng tới mode w như sau:

FILE * fp =

NULL

;


fp = fopen(

"sample.txt"

,

"w"

);


Hoặc nếu bạn mong muốn mở để ghi chèn file, hãy dùng tới mode α như sau:

FILE * fp =

NULL

;


fp = fopen(

"sample.txt"

,

"a"

);


Không những thế nếu bạn mong muốn mở file & để vừa ghi & vừa ghi đè file đó, hiện thời mode cần dùng để mở file không phải là mode w, mà sẽ là mode r+ ví dụ.

FILE * fp =

NULL

;


fp = fopen(

"sample.txt"

,

"r+"

);


Cụ thể về các mode ghi file cũng được trình bày đầy đủ trong bài Mở file trong C.

Sau thời điểm đã mở file thành công bình một trong hai hàm trên, hiện thời tất cả chúng ta đã có thể tiến hành ghi dữ liệu vào file trong ͼ với các mẹo sau đây.

Ghi ký tự vào file bằng hàm fputc

Hàm fputc trong C là một hàm có sẵn trong thư viện chuẩn, có công dụng ghi từng ký tự vào file chỉ định. Tên hàm fputc được viết tắt bởi cụm từ file, put & character, được dịch theo tiếng Việt đúng đắn là hàm ghi từng ký tự vào file.

Tất cả chúng ta sử dụng hàm fputc trong C với cú pháp sau đây:

int fputc(int char, FILE * fp);

Trong số đó:

  • fp là con trỏ của file cần ghi, được tạo thành từ việc mở file ở phần trên.
  • char là ký tự cần ghi vào file

Hàm fputc sẽ trả về ký tự đã được ghi vào file. Trong trường việc ghi file thất bại thì giá trị EOF sẽ được trả về.

Xem Thêm  Mảng hai chiều trong Java - sắp xếp chuỗi trong java

Chẳng hạn rõ ràng và cụ thể, tất cả chúng ta sẽ ghi dòng text Hello vào file trống sample.txt. Tất cả chúng ta sẽ dùng hàm fopen để mở file, sau đó ghi từng ký tự có trong dòng bài viết này vào file bằng hàm fputc như sau:



int

main

(

void

)


{


FILE * fp =

NULL

;



fopen_s(&fp,

"sample.txt"

,

"w"

);



fputc(

'Н'

, fp);


fputc(

'e'

, fp);


fputc(

'ɭ'

, fp);


fputc(

'ɭ'

, fp);


fputc(

'σ'

, fp);


fputc(

'ɳ'

, fp);



fclose(fp);



return

;


}


Kết quả, các ký tự trong chuỗi sẽ được lần lượt ghi vào file sample.txt như sau:

Hello



Ghi chuỗi vào file trong C bằng hàm fputs

Hàm fputs trong C

Việc ghi từng ký tự vào file bằng hàm fputc thật là vất vả phải không nào? Này là nguyên nhân mà hàm fputs với tính năng ghi chuỗi vào file đã được chào đời.

Hàm fputs trong C là một hàm có sẵn trong thư viện chuẩn, có công dụng ghi từng chuỗi vào file chỉ định. Tên hàm fputs được viết tắt bởi cụm từ file, put & string, được dịch theo tiếng Việt đúng đắn là hàm ghi chuỗi vào file.

Tất cả chúng ta sử dụng hàm fputs trong C với cú pháp sau đây:

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

  • fp là con trỏ của file cần ghi, được tạo thành từ việc mở file
  • str là con trỏ tới nơi lưu trữ chuỗi đã ghi từ dòng vào file. Thông thường tất cả chúng ta chỉ định str bằng một chuỗi.

Hàm fputs sẽ trả về 0 nếu việc ghi chuỗi vào file thành cônt. Trong trường hợp việc ghi file thất bại thì EOF sẽ được trả về.

Chú ý là hàm fputs không auto ghi ký tự xuống dòng ɳ sau khoảng thời gian đã ghi chuỗi, do vậy khi mong muốn xuống dòng khi ghi chuỗi thì tất cả chúng ta phải tự điền ký tự ɳ vào địa điểm cần xuống dòng trong chuỗi.

Chẳng hạn dùng hàm fputs để ghi chuỗi vào file trong C

Chẳng hạn rõ ràng và cụ thể, tất cả chúng ta sẽ ghi bài viết sau vào file trống Hello.txt.

Hello World!
Ι am Kiyoshi

Tất cả chúng ta sẽ dùng hàm fopen để mở file, sau đó ghi các chuỗi này vào file bằng hàm fputs như sau:



int

main

(

void

)


{


FILE * fp =

NULL

;



fopen_s(&fp,

"Hello.txt"

,

"w"

);



fputs

(

"Hello World!nI am Kiyoshi"

, fp);



fclose(fp);



return

;


}


Kết quả, chuỗi chỉ định sẽ được lần lượt ghi vào file sample.txt như sau:

Hello World!


Ι am Kiyoshi


Ghi dữ liệu vào file trong C theo định dạng bằng hàm fprintf

Hàm fprintf trong C là gì

Hàm fprintf trong C là một hàm có sẵn trong thư viện chuẩn, có công dụng ghi dữ liệu vào file theo định dạng chỉ định.

Bằng cách dùng hàm fprintf, tất cả chúng ta có thể định dạng các dữ liệu thuộc nhiều kiểu khác nhau, & sau đó ghi chúng vào các file có định dạng cố định như file CSV, JSON ví dụ.

Tất cả chúng ta sử dụng hàm fprintf trong C với cú pháp sau đây:

int fprintf(fp, “fo1 fo2 fo3 … “, var1, var2, var3 …);

Trong số đó

  • fp là con trỏ của file cần ghi, được tạo thành từ việc mở file ở phần trên.
  • Các cặp fo & var tương ứng là định dạng (format) ghi vào file của dữ liệu, & tên biến chứa dữ liệu đó.

Phương châm hoạt động của hàm fprintf là lấy dữ liệu từ biến var, định dạng nó theo định dạng ghi trong fo để tạo thành một chuỗi. Sau đó thì ghi chuỗi vừa tạo này vào file mà con trỏ fp chỉ đến.

Xem Thêm  Cách xem bảng trong SQL Server - xem bảng trong sql

Hàm fprintf sẽ trả về một số thuộc kiểu int, chính là số ký tự có trong chuỗi được tạo. Trong trường hợp việc ghi file thất bại thì giá trị EOF sẽ được trả về.

Định dạng dữ liệu sử dụng trong hàm fprintf

Định dạng (format) của dữ liệu cần ghi cũng như kiểu của biến lưu dữ liệu được tóm lược trong bảng dưới đây:

Định dạng chuyển đổiKiểu biếnChi tiếtphần trămhhdchar
unsigned charChuyển về dạng thập phân & lưu trữ trong biến 1 bytephần trămhdshort
unsigned shortChuyển về dạng thập phân & lưu trữ trong biến 2 bytephần trămdint
unsigned intChuyển về dạng thập phân & lưu trữ trong biến kiểu intphần trămldlong
unsigned longChuyển về dạng thập phân & lưu trữ trong biến 4 bytephần trămhhxchar
unsigned charChuyển về hệ thập lục phân & lưu trữ trong biến 1 bytephần trămhxshort
unsigned shortChuyển về hệ thập lục phân & lưu trữ trong biến 2 bytephần trămxint
unsigned intChuyển về hệ thập lục phân & lưu trữ trong biến kiểu intphần trămlxlong
unsigned longChuyển về hệ thập lục phân & lưu trữ trong biến 4 bytephần trămffloatChuyển về số thực dấu phẩy động & lưu trữ trong biến kiểu floatphần trămlfdoubleChuyển về số thực dấu phẩy động & lưu trữ trong biến kiểu doublephần trămccharChuyển về 1 ký tự & lưu trữ trong biến kiểu charphần trămschar *Chuyển về chuỗi ký tự & lưu trữ trong biến kiểu mảng charphần trămpvoid *Chuyển về địa chỉ & lưu trữ trong con trỏ

Chẳng hạn ghi dữ liệu vào file trong C

Giả sử tất cả chúng ta có các kiểu thông tin như [chuỗi], [ký tự] & [số] được lưu vào các biến tương ứng. Bằng cách dùng hàm fprintf, tất cả chúng ta có thể định dạng các thông tin này & ghi vào file như chương trình sau đây:



int

main

(

void

)


{


FILE * fp =

NULL

;



char

name[] =

"Kiyoshi"

;


char

sex =

'ʍ'

;


int

old =

30

;



fopen_s(&fp,

"user.txt"

,

"w"

);




fprintf

(fp,

"%s %c %dn"

, name, sex, old);


fprintf

(fp,

"%s,%c,%dn"

, name, sex, old);


fprintf

(fp,

"name: %s, sex: %c, olde: %dn"

, name, sex, old);


fclose(fp);



return

;


}


Kết quả, các dữ liệu với định dạng chỉ định sẽ được vào file Hello.txt như sau:

Kiyoshi ʍ 30


Kiyoshi,ʍ,30


name: Kiyoshi, sex: ʍ, old: 30


Giống như vậy, các kiểu thông tin như [chuỗi], [ký tự] & [số] sẽ được ghi theo định dạng chỉ định vào file.

Ghi mảng vào file trong ͼ

Áp dụng hàm fprintf, tất cả chúng ta có thể thực hiện ghi mảng vào file trong ͼ.

Do các phần tử trong mảng C đều có cùng kiểu dữ liệu, nên tất cả chúng ta có thể chỉ định cùng kiểu định dạng để ghi các phần tử từ mảng vào file bằng hàm hàm fprintf. Chẳng hạn rõ ràng và cụ thể:



int

main

(

void

)


{


FILE * fp =

NULL

;



int

num[] = {

10

,

20

,

44

,

60

,

82

};



fopen_s(&fp,

"num.txt"

,

"w"

);





fprintf

(fp,

"%d %d %d %d %d"

, num[

], num[

1

], num[

2

], num[

3

], num[

4

]);



fclose(fp);



return

;


}


Kết quả, bài viết mảng sẽ được ghi vào file như sau:

10 20 44 60 82


Một cách tương đương thì tất cả chúng ta cũng có thể ghi các mảng 2 chiều vào file trong C. Khi đó mỗi mảng con một chiều trong mảng 2 chiều sẽ được xem như một dòng để ghi vào file, & tất cả chúng ta cần phải thêm ký tự xuống dòng ɳ khi ghi từng mảng dòng vào file như sau:



int

main

(

void

)


{


FILE * fp =

NULL

;



int

bangdiem[][

3

] = {


{

7

,

9

,

8

} ,


{

8

,

6

,

7

} ,


{

5

,

7

,

6

} ,


{

4

,

9

,

5

} ,


{

5

,

8

,

7

} ,


{

6

,

9

,

3

}


} ;



int

y =

sizeof

(bangdiem) /

sizeof

(bangdiem[

]);


int

Ҳ =

sizeof

(bangdiem[

]) /

sizeof

(bangdiem[

][

]);



fopen_s(&fp,

"bangdiem.txt"

,

"w"

);




for

(

int

ι =

; ι < y; ι++){


fprintf

(fp,

"Toan: %d Van: %d Anh: %dn"

, bangdiem[i][

], bangdiem[i][

1

], bangdiem[i][

2

]);


}



fclose(fp);



return

;


}


Kết quả, từng dòng sẽ được ghi vào file như sau:

Toan: 7 Van: 9 Anh: 8


Toan: 8 Van: 6 Anh: 7


Toan: 5 Van: 7 Anh: 6


Toan: 4 Van: 9 Anh: 5


Toan: 5 Van: 8 Anh: 7


Toan: 6 Van: 9 Anh: 3



  • Đọc thêm: Mảng 2 chiều trong ͼ
Xem Thêm  JavaScript không bằng và Giải thích các toán tử so sánh - js không bằng

Ghi kết cấu vào file trong ͼ

Áp dụng hàm fprintf, tất cả chúng ta có thể thực hiện ghi kết cấu vào file trong ͼ.

Do các member trong kết cấu C có thể có kiểu dữ liệu khác nhau, nên tất cả chúng ta cần chỉ định kiểu định dạng thích hợp cho từng member để ghi giá trị của chúng từ mảng vào file bằng hàm hàm fprintf.

Chẳng hạn tất cả chúng ta ghi dữ liệu từ mảng kết cấu vào file trong C bằng hàm fprintf như sau:






typedef

struct

{


char

name[

20

];


char

sex;


int

age;


double

height;


double

weight;


}

person_t

;



int

main

(

void

)


{



person_t

ᴘ[PERSON_NUM] = {{

"Bob"

,

'ʍ'

,

19

,

165.4

,

72.5

},


{

"Alice"

,

'₣'

,

19

,

161.7

,

44.2

},


{

"Tom"

,

'ʍ'

,

20

,

175.2

,

66.3

},


{

"Stefany"

,

'₣'

,

18

,

159.3

,

48.5

},


{

"Leonardo"

,

'ʍ'

,

19

,

172.8

,

67.2

}};



FILE * fp =

NULL

;




fopen_s(&fp,

"people.txt"

,

"w"

);




fprintf

(fp,

"%s %s %s %s %sn"

,

"name"

,

"sex"

,

"age"

,

"height"

,

"weight"

);




for

(

short

ι =

; ι < PERSON_NUM; ι++) {


fprintf

(fp,

"%s %c %d %.2f %.2f n"

,ᴘ[i].name, ᴘ[i].sex,ᴘ[i].age,ᴘ[i].height,ᴘ[i].weight);


}



fclose(fp);



return

;


}


Kết quả, bài viết mảng kết cấu sẽ được ghi vào file như sau:

name sex age height weight


Bob ʍ 19 165.40 72.50


Alice ₣ 19 161.70 44.20


Tom ʍ 20 175.20 66.30


Stefany ₣ 18 159.30 48.50


Leonardo ʍ 19 172.80 67.20



Ghi file CSV trong C

Ở phần trên, tất cả chúng ta đã tiến hành ghi bài viết các kiểu dữ liệu cầu kỳ như mảng hay kết cấu vào file dưới dạng file txt rồi. Không những thế tất cả chúng ta cũng có thể ghi dữ liệu trên vào file CSV trong C, dễ dàng bằng cách biến đổi đuôi file từ .txt sang .csv là xong.

Chẳng hạn rõ ràng và cụ thể, tất cả chúng ta ghi dữ liệu từ mảng kết cấu vào file CSV trong C bằng hàm fprintf như sau. Chú ý là tất cả chúng ta cần viết định dạng các dữ liệu cách nhau bởi dấu phẩy để có thể ghi từng dữ liệu vào từng ô trong file CSV.





typedef

struct

{


char

name[

20

];


char

sex;


int

age;


double

height;


double

weight;


}

person_t

;



int

main

(

void

)


{



person_t

ᴘ[PERSON_NUM] = {{

"Bob"

,

'ʍ'

,

19

,

165.4

,

72.5

},


{

"Alice"

,

'₣'

,

19

,

161.7

,

44.2

},


{

"Tom"

,

'ʍ'

,

20

,

175.2

,

66.3

},


{

"Stefany"

,

'₣'

,

18

,

159.3

,

48.5

},


{

"Leonardo"

,

'ʍ'

,

19

,

172.8

,

67.2

}};



FILE * fp =

NULL

;



int

num[] = {

10

,

20

,

44

,

60

,

82

};



fopen_s(&fp,

"people.csv"

,

"w"

);




fprintf

(fp,

"%s,%s,%s,%s,%sn"

,

"name"

,

"sex"

,

"age"

,

"height"

,

"weight"

);


for

(

short

ι =

; ι < PERSON_NUM; ι++) {


fprintf

(fp,

"%s,%c,%d,%.2f,%.2fn"

,ᴘ[i].name, ᴘ[i].sex,ᴘ[i].age,ᴘ[i].height,ᴘ[i].weight);


}





fclose(fp);



return

;


}


Kết quả, bài viết mảng kết cấu sẽ được ghi vào file people.csv như sau:
Ghi vào file CSV trong C

Kết luận

Trên đây Kiyoshi đã chỉ dẫn các bạn về cách ghi file trong C rồi. Để nắm vững bài viết bài học hơn, bạn hãy thực hành viết lại các chẳng hạn của ngày bây giờ nhé.

& hãy cùng tìm tòi những tri thức sâu hơn về C trong các bài học kế tiếp.

Viết một bình luận