手把手教會你C語言檔案操作(3)
檔案的寫入操作
如題所說,這篇博文就來聊聊檔案的寫入,也就是將資料從程式中儲存至指定檔案當中。
在上一篇博文中,我們討論並嘗試了檔案的讀取操作,以及改變檔案操作指標位置的操作,並運用了例項以及一個小小的面試題,佐證和練習了一下先關函數借口的用法,同時也留了一個小作業,不知道有沒有小童鞋完成呢 =_=
手把手教會你C語言檔案操作(1)
手把手教會你C語言檔案操作(2)
檔案操作相關函式
好吧,我也知道沒啥人看我的寫的部落格,就不自取其辱了,直接進入正題吧。
1. 關於寫入操作時的操作許可權問題
首先要明確一下這個操作許可權指的是什麼。它是指我們用 fopen 開啟某個檔案時所指定的第二引數。
關於這個第二引數在講 fopen 時並沒有多說,只是簡單地指定了一個只讀許可權,當然,在沒有涉及到檔案寫入的操作時,這個只讀許可權完全足夠,但到了就要注意一下了。
開啟方式 | 說明 |
---|---|
“r” | 以“只讀”方式開啟檔案。只允許讀取,不允許寫入。檔案必須存在,否則開啟失敗。 |
“w” | 以“寫入”方式開啟檔案。如果檔案不存在,那麼建立一個新檔案;如果檔案存在,那麼清空檔案內容(相當於刪除原檔案,再建立一個新檔案)。 |
“a” | 以“追加”方式開啟檔案。如果檔案不存在,那麼建立一個新檔案;如果檔案存在,那麼將寫入的資料追加到檔案的末尾(檔案原有的內容保留)。 |
“r+” | 以“讀寫”方式開啟檔案。既可以讀取也可以寫入,也就是隨意更新檔案。檔案必須存在,否則開啟失敗。 |
“w+” | 以“寫入/更新”方式開啟檔案,相當於w和r+疊加的效果。既可以讀取也可以寫入,也就是隨意更新檔案。如果檔案不存在,那麼建立一個新檔案;如果檔案存在,那麼清空檔案內容(相當於刪除原檔案,再建立一個新檔案)。 |
“a+” | 以“追加/更新”方式開啟檔案,相當於a和r+疊加的效果。既可以讀取也可以寫入,也就是隨意更新檔案。如果檔案不存在,那麼建立一個新檔案;如果檔案存在,那麼將寫入的資料追加到檔案的末尾(檔案原有的內容保留)。 |
“t” | 文字檔案。如果不寫,預設為"t"。 |
“b” | 以二進位制方式開啟檔案,可以與上面的許可權組合,如 rb 等。 |
上面的許可權及說明要牢記喲,記不住的話也要知道在哪裡能夠找到它們哦。
還有就是,沒有直接能夠插入資料的許可權!!!
這麼說可能不好理解,舉個例子吧:
比如我有一個字串:abcdefg
我想要在 c 後面插入 12 這個數字,我們想要的結果是這樣的:
abc12defg
可事實上我們如果先偏移檔案操作指標至 c 之後再寫入內容,得到的將會是:abc12fg
也就是說它是把原來那個位置上的內容給覆蓋掉了。
如果還執有疑惑的童鞋不要急,敢於質疑是一個好習慣,不過我們先來看看寫入函式並掌握它的用法,再來驗證一番。
2. 檔案寫入函式 fwrite
函式原型:
size_t fwrite(void *ptr, size_t size, size_t count, FILE *fp);
資料來源 每一塊多大 一共多少塊 寫到哪兒
@ptr: 臨時存放要寫入的內容的緩衝區
@size: 每次讀取的資料塊的大小
@count: 一共讀取多少塊資料
返回值:成功寫入的資料塊塊數( 0 <= 返回值 <= count )。
這個函式與 fread 函式引數基本一致,不做過多介紹,簡單說明一下第一引數,一般是一個緩衝區,但他最好是有內容的,然後要注意這個緩衝區一般都是以字串形式存在,要注意你所寫的內容是否需要字串結束符 \0 。
然後就是寫入時選擇的許可權問題,要考慮一下,若是檔案存在,我是想要清空裡面的內容呢,還是隻是想要追加在原有檔案之後?
若是不想清空,就用 r+ : 這個就是在原有基礎上覆蓋,在什麼位置寫入多少,這個檔案就改變多少。
若是不想清空,也不想修改原有資料,只是追加就用 a 或 a+ 。
若是清空則用 w 或 w+ 。
舉個例子,順便驗證一下在 1 中所提到的問題:
要寫入的目標檔案 a.txt 初始內容。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
const char *fileName = "C:\\Users\\Administrator\\Desktop\\a.txt";
// 開啟檔案
FILE *fp = fopen(fileName, "r+");
if(fp == NULL) printf("open error\n");
int ret;
char buf[5] = "12"; // 要寫入的內容
// 檔案操作位置偏移至 c 之後
ret = fseek(fp, 3, SEEK_SET);
if(ret == -1) printf("fseek error\n");
// 將資料寫入檔案
ret = fwrite(buf, 2, 1, fp);
if(ret <= 0) printf("fwrite error\n");
fclose(fp);
return 0;
}
執行完畢之後:
這樣同樣也佐證了我上面所說 **沒有直接插入操作的許可權** 這一說法。
3. 按格式寫入 fprintf
函式原型:
int fprintf(FILE *stream, const char *format, ...);
這個函式與我們之前說過的 fscanf 簡直一毛一樣,我就不再重複了,給個連結對比一下:
上例項:
還是剛剛的 a.txt ,我們寫入一個學生的簡單基本資訊
zahngsan M 25 csdn
#include <stdio.h>
int main()
{
FILE *fp = fopen(fileName, "a+");
if(fp == NULL) qDebug() << "open error";
int ret;
char stu_name[] = "zhangsan";
char stu_sex[] = "M";
int stu_age = 25;
char stu_coll[] = "csdn";
// 按照資料型別,分別用不同格式寫入,一條資料佔一行,所以帶上了換行符 \n
ret = fprintf(fp, "%s %s %d %s\n", stu_name, stu_sex, stu_age, stu_coll);
if(ret <=0 )
{
printf("fprinf error\n");
}
fclose(fp);
return 0;
}
執行結果:
4. 總結
好啦,到這裡檔案操作就介紹完了,可能有同學會說我寫的太少了,攏共也就不超過 10 個函式就說講完了,別人都講了好多呢。
確實,剩下的函式,我並沒有說不要學,只是我覺得有這些就足夠你完成想要完成基本的檔案操作了,若是想要深入研究,可以先將我沒有講到的函式嘗試一遍,掌握用法,再去深入瞭解。
基礎已經講完,至於你能將他們玩的多花裡胡哨就看個人本事啦。
那麼,手把手教會你C語言檔案操作系列到此結束啦,如果對您有幫助,可以再評論區留下你的足跡,謝謝各位啦~