<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家在寫程式的時候有沒有一個困惑,就是我寫的程式,輸入一些資料後,當我把程式關掉以後資料就消失了。這是因為程式執行時,所有的資料都儲存在記憶體中,當程式退出後,程式中的資料自然就不存在了。等下次再執行程式時,又要重新錄入資料,非常難受
如何解決這個問題呢,我們可以學習使用檔案來將其儲存
在程式設計中,一般將檔案分為兩部分:程式檔案和資料檔案
程式檔案:
包括源程式檔案(字尾為.c),目標檔案(windows環境字尾為.obj),可執行程式(windows環境字尾為.exe)。
資料檔案:
檔案的內容不一定是程式,而是程式執行時讀寫的資料,比如程式執行需要從中讀取資料的檔案或者輸出內容的檔案
這次我們想要聊的是第二種資料檔案,它可以幫助將我們執行時的資料儲存到磁碟中,以便我們下次使用
每一個檔案都有自己的名字,它由三部分組成
檔案路徑+檔名主幹+檔案字尾
c:codetest.txt
想要開啟一個檔案,我們需要使用到檔案指標,該指標是由系統宣告的,例如,VS2013編譯環境提供的 stdio.h 標頭檔案中有以下的檔案型別申明
struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;
相信很多人看到這裡,已經不想再讀下去了,堅持一下,前面這些並不重要
首先我們需要定義一個檔案指標
FILE* pf
想要將資料儲存到檔案中或者從檔案中讀取資料,我們先要將檔案開啟,ANSIC 規定使用fopen函數來開啟檔案。
FILE * fopen ( const char * filename, const char * mode );
filename: 檔名
mode : 檔案的開啟方式
下面是一些常見的mode
檔案使用方式 | 含義 | 如果指定檔案不存在 |
---|---|---|
“r”(唯讀) | 為了輸入資料,開啟一個已經存在的文字檔案 | 出錯 |
“w”(只寫) | 為了輸出資料,開啟一個文字檔案 | 建立一個新的檔案 |
“a”(追加) | 向文字檔案尾新增資料 | 建立一個新的檔案 |
“rb”(唯讀) | 為了輸入資料,開啟一個二進位制檔案 | 出錯 |
“wb”(只寫) | 為了輸出資料,開啟一個二進位制檔案 | 建立一個新的檔案 |
“ab”(追加) | 向一個二進位制檔案尾新增資料 | 出錯 |
“r+”(讀寫) | 為了讀和寫,開啟一個文字檔案 | 出錯 |
“w+”(讀寫) | 為了讀和寫,建議一個新的檔案 | 建立一個新的檔案 |
“a+”(讀寫) | 開啟一個檔案,在檔案尾進行讀寫 | 建立一個新的檔案 |
“rb+”(讀寫) | 為了讀和寫開啟一個二進位制檔案 | 出錯 |
“wb+”(讀寫) | 為了讀和寫,新建一個新的二進位制檔案 | 建立一個新的檔案 |
“ab+”(讀寫) | 開啟一個二進位制檔案,在檔案尾進行讀和寫 | 建立一個新的檔案 |
注:這裡的輸入是指將資料寫到記憶體中,輸出是寫到檔案中
3.讀寫資料後使用fclose關閉檔案。
int fclose ( FILE * stream );
// 範例 #include <stdio.h> int main () { FILE * pFile; //開啟檔案 pFile = fopen ("myfile.txt","w"); //檔案操作 if (pFile!=NULL) { fputs ("fopen example",pFile); //關閉檔案 fclose (pFile); } return 0; }
現在我們知道了,如何去開啟一個檔案,那麼如何將它的資料輸入到程式中呢?
首先我想介紹一些函數
功能 | 函數名 | 適用於 |
---|---|---|
字元輸入函數 | fgetc | 所有輸入流 |
字元輸出函數 | fputc | 所有輸出流 |
文字行輸入函數 | fgets | 所有輸入流 |
文字行輸出函數 | fputs | 所有輸出流 |
格式化輸入函數 | fscanf | 所有輸入流 |
格式化輸出函數 | fprintf | 所有輸出流 |
二進位制輸入 | fread | 檔案 |
二進位制輸出 | fwrite | 檔案 |
看不懂? 沒關係,接下來我將用一個範例告訴你如何使用。
//這是我以前寫通訊錄時用到的一些方法 typedef struct Contact { struct contact_person* data; int count; //通訊錄中人員個數 int capacity; }Contact;//通訊錄型別的指標 void Save(Contact* con) //將資料儲存到檔案中 { FILE* fp = fopen("contact.txt", "wb"); if (fp == NULL) { printf("Save()::%s", strerror(errno)); //如果開啟失敗,報錯 return; } else { fwrite(con->data, sizeof(struct contact_person), con->count, fp);//將資料寫到contect.txt中 } fclose(fp); //關閉檔案 fp = NULL; } void Load(Contact* con) //將檔案中的資料載入到記憶體中 { FILE* fp = fopen("contact.txt", "r"); if (fp == NULL) { printf("Load()::%s", strerror(errno)); return; } else { struct contact_person tmp; while (fread(&tmp, sizeof(struct contact_person), 1, fp))// fread的返回值為讀到資料的個數,用來判斷是否繼續讀取 { Check_capacity(con);//檢測通訊錄容量是否足夠 con->data[con->count] = tmp; con->count++; } } fclose(fp); fp = NULL; }
到此這篇關於深入瞭解C語言中常見的檔案操作方法的文章就介紹到這了,更多相關C語言檔案操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45