1. 程式人生 > 其它 >手把手教會你C語言檔案操作(3)

手把手教會你C語言檔案操作(3)

技術標籤:C語言c語言linux經驗分享

檔案的寫入操作

如題所說,這篇博文就來聊聊檔案的寫入,也就是將資料從程式中儲存至指定檔案當中。

在上一篇博文中,我們討論並嘗試了檔案的讀取操作,以及改變檔案操作指標位置的操作,並運用了例項以及一個小小的面試題,佐證和練習了一下先關函數借口的用法,同時也留了一個小作業,不知道有沒有小童鞋完成呢 =_=

手把手教會你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 簡直一毛一樣,我就不再重複了,給個連結對比一下:

手把手教會你C語言檔案操作

上例項:
還是剛剛的 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語言檔案操作系列到此結束啦,如果對您有幫助,可以再評論區留下你的足跡,謝謝各位啦~