在c語言學習過程中,對於資料的儲存是無法避免的問題之一。
我們學習了用陣列來儲存某一種型別資料,用結構體來儲存多種不同型別資料,但是這些都是程式中的容器,程式退出後這些資料也就隨之消失了。
所以我們嘗試尋找一種方式,能夠將資料儲存與程式分離開來。在 linux 中有這麼一句話——一切皆檔案。所以我們嘗試將資料儲存到檔案之中,那麼這樣一來就無可避免的要學習檔案操作了,本文盡量詳細的把常見檔案操作列舉出來,希望能夠幫到小萌新。
關於檔案操作函式接**有整理過,→戳這裡
當然了,在寫**之前先要考慮標頭檔案,以防碼**過程**現的函式未宣告等錯誤提示影響思路與心情。
#include
#include
#include
其實只要標準io標頭檔案就好了,不過一般還會涉及到字串處理等操作,索性再加上他們好了。
函式原型
file *
fopen
(const
char
*pathname,
const
char
*mode)
;@param pathname : 要操作的檔名,可以是相對路徑也可以是絕對路徑。
@param mode : 操作許可權,常用的有 r
(read),w
(write),a
@return values : 成功返回 檔案流指標, 失敗返回 null
;int
fclose
(file *stream)
;@param stream : 檔案操作流指標
這兩個操作是成對出現的哦,既然開啟了檔案,操作完成之後就要好好關上它的哦,以防止其他地方誤操作導致不經意之間改變檔案內容。
#include
#include
#include
intmain()
// doing sth.
fclose
(fp)
;// 關閉檔案
return0;
}
以上就是開啟與關閉檔案的操作啦,是不是很簡單?哈哈,雖然我們只是開啟然後又關上,感覺寫了個寂寞,但這只是開始嘛,慢慢來。
首先,我要說明一下 2 中的**裡的 a.txt 這個檔案,它裡面儲存著 a-z 這26和英文本母。
然後呢,從檔案中讀取有很多方法,在這裡呢我只介紹用的比較多的,相對安全的幾個函式。
3.1 fread 函式
函式原型
size_t fread
(void
*ptr, size_t size,
size_t nmemb, file *stream)
;// 這個函式引數好像變多了呢,我們一起好好看一下它要什麼吧。
@param ptr : 緩衝區指標,也就是說我們讀出來的資料放在什麼位置。
@param size : 一次讀多大呢?
@param nmember : 讀幾次呢?
@param stream : 從**讀呢?
// 這樣一分析好像也不難,我們只要根據函式要求給定引數就可以操作了。
@return values : 成功返回讀取的次數,失敗返回0
既然了解完了這個函式的引數要求,那我們來嘗試一下,把我存在 a.txt 檔案中的26個字母讀取出來吧。
#include
#include
#include
intmain()
// 開啟檔案成功之後呢,這個 fp 就是指那個檔案啦,
// 我們的操作也是建立在它的基礎之上的。
// fread 需要乙個緩衝區,用於存放讀取出來的資料,那我們就先準備好
// 因為要讀取 26 個字,所以多申請乙個字元空間用來放'\0'
char read_buffer[27]
=;//萬事具備,直接呼叫函式
size_t read_ret =
fread
(read_buffer,26,
1, fp);if
(read_ret ==0)
// 保險起見,判斷一下是否讀取成功
// 成功讀取,列印一下讀到了啥
printf
("read successed, the contain is : %s\n"
, read_buffer)
;fclose
(fp)
;// 關閉檔案
return0;
}
好啦,這樣就把26個字母讀取出來了,不知道你們有沒有成功呢?
3.2 fscanf
還記得我們用的最多的輸入函式嗎?對的,就是 scanf 函式,我們可以來回顧一下它的函式原型:
int
scanf
(const
char
*format,..
.);
嘿嘿,是不是有些童鞋覺得有點奇怪,這是個啥,還有那3個點是什麼鬼?
相信學霸同學已經認出來了,這是乙個變參函式,具體怎麼實現我們這裡就不介紹了,有興趣的同學可以去查一查,不過我們可以簡單說說。
還記得我們怎麼使用麼?是不是%?的形式呀,簡單來說就是根據這個格式控制符的個數以及對應格式來確定這後面到底有幾個,是什麼型別的引數。這樣一說應該就有點了解了吧。
我們這裡說的是它的另乙個兄弟,fscanf,按照慣例,先看看函式原型:
int
fscanf
(file *stream,
const
char
*format,..
.);
em。。。咋那麼眼熟是吧,就比scanf多了乙個引數,stream:檔案流指標。
那它怎麼用呢?用在哪兒呢?
現在我又有了個新檔案b.txt,裡面儲存著乙個同學的簡單基本資訊:
姓名 年齡 性別 所在學校
張三 22 男 csdn大學
那如果我有乙個學生結構體,剛好就是這4項,我該如何用這個給結構體賦值呢?
typedef
struct
stu ;
方法1:以字串形式讀取一行,然後按要求切割後,分別賦值即可。
方法2:以格式讀取,直接獲取對應資料。
這裡呢就不演示方法1了,字串處理雖然很重要但不是本文要討論的內容,我們來看看如何按格式讀取。
#include
#include
#include
typedef
struct
stu ;
intmain()
int ret =
fscanf
(fp,
"%s %d %s %s\n"
, student.stu_name,
&student.stu_age,
student.stu_***, student.stu_coll);if
(ret ==0)
printf
("%s %d %s %s\n"
, student.stu_name, student.stu_age,
student.stu_***, student.stu_coll)
;fclose
(fp)
;// 關閉檔案
return0;
}
這樣就可以按照相應的格式讀取出相應的資料了,是不是很簡單方便?
其實到這裡就應該有同學會發現一件事情了,為什麼你都是檔案開頭開始讀取啊,要是我想要的是在檔案中間部分怎麼辦?全部讀取出來再處理字串嗎?檔案小當然可以,但是檔案大了這樣操作肯定是不現實的啊。
是的,這個問題發現的很及時,要解決這個問題就要涉及到檔案操作指標位置偏移的操作了,感覺本文湊字數湊得差不多了,那就下次再說吧,如果有興趣的話可以先去查一查資料哦。
手把手教會你C語言檔案操作(2)
linux c 檔案操作 手把手教會你c語言檔案操作 1 2.檔案操作位置是否到達了文件末尾?1.1 偏移操作 說是說指標偏移,將其稱之為 尋找操作位置 也未嘗不可,也更加容易記住這個函式。為什麼這麼說呢,尋找 seek,不難猜出這個函式就是 fseek。來看看函式原型 int fseek file...
手把手教會你C語言檔案操作(3)
如題所說,這篇博文就來聊聊檔案的寫入,也就是將資料從程式中儲存至指定檔案當中。手把手教會你c語言檔案操作 1 手把手教會你c語言檔案操作 2 檔案操作相關函式 好吧,我也知道沒啥人看我的寫的部落格,就不自取其辱了,直接進入正題吧。首先要明確一下這個操作許可權指的是什麼。它是指我們用fopen開啟某個...
手把手入門C語言 列舉
列舉中的變數是遞增的 預設是0開始 首元素的值是0 include include 列舉中的變數是遞增的 預設是0開始 首元素的值是0 定義乙個列舉 enum weekday main 測試列舉中的變數是遞增的 修改下面的 monday 0,tuesday,wednesday,thursday,fr...