深入了解C語(yǔ)言中常見(jiàn)的文件操作方法
1.為什么使用文件
大家在寫程序的時(shí)候有沒(méi)有一個(gè)困惑,就是我寫的程序,輸入一些數(shù)據(jù)后,當(dāng)我把程序關(guān)掉以后數(shù)據(jù)就消失了。這是因?yàn)槌绦蜻\(yùn)行時(shí),所有的數(shù)據(jù)都存儲(chǔ)在內(nèi)存中,當(dāng)程序退出后,程序中的數(shù)據(jù)自然就不存在了。等下次再運(yùn)行程序時(shí),又要重新錄入數(shù)據(jù),非常難受
? 如何解決這個(gè)問(wèn)題呢,我們可以學(xué)習(xí)使用文件來(lái)將其保存
2.什么是文件
2.1文件分類
在程序設(shè)計(jì)中,一般將文件分為兩部分:程序文件和數(shù)據(jù)文件
程序文件:
包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。
數(shù)據(jù)文件:
文件的內(nèi)容不一定是程序,而是程序運(yùn)行時(shí)讀寫的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件或者輸出內(nèi)容的文件
這次我們想要聊的是第二種數(shù)據(jù)文件,它可以幫助將我們運(yùn)行時(shí)的數(shù)據(jù)存儲(chǔ)到磁盤中,以便我們下次使用
2.2 文件名
每一個(gè)文件都有自己的名字,它由三部分組成
文件路徑+文件名主干+文件后綴
c:\code\test.txt
3.文件的打開(kāi)和關(guān)閉
3.1文件指針
想要打開(kāi)一個(gè)文件,我們需要使用到文件指針,該指針是由系統(tǒng)聲明的,例如,VS2013編譯環(huán)境提供的 stdio.h 頭文件中有以下的文件類型申明
struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;
相信很多人看到這里,已經(jīng)不想再讀下去了,堅(jiān)持一下,前面這些并不重要
3.2 如何使用文件指針
首先我們需要定義一個(gè)文件指針
FILE* pf
想要將數(shù)據(jù)存儲(chǔ)到文件中或者從文件中讀取數(shù)據(jù),我們先要將文件打開(kāi),ANSIC 規(guī)定使用fopen函數(shù)來(lái)打開(kāi)文件。
FILE * fopen ( const char * filename, const char * mode );
filename: 文件名
mode : 文件的打開(kāi)方式
下面是一些常見(jiàn)的mode
文件使用方式 | 含義 | 如果指定文件不存在 |
---|---|---|
“r”(只讀) | 為了輸入數(shù)據(jù),打開(kāi)一個(gè)已經(jīng)存在的文本文件 | 出錯(cuò) |
“w”(只寫) | 為了輸出數(shù)據(jù),打開(kāi)一個(gè)文本文件 | 建立一個(gè)新的文件 |
“a”(追加) | 向文本文件尾添加數(shù)據(jù) | 建立一個(gè)新的文件 |
“rb”(只讀) | 為了輸入數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件 | 出錯(cuò) |
“wb”(只寫) | 為了輸出數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件 | 建立一個(gè)新的文件 |
“ab”(追加) | 向一個(gè)二進(jìn)制文件尾添加數(shù)據(jù) | 出錯(cuò) |
“r+”(讀寫) | 為了讀和寫,打開(kāi)一個(gè)文本文件 | 出錯(cuò) |
“w+”(讀寫) | 為了讀和寫,建議一個(gè)新的文件 | 建立一個(gè)新的文件 |
“a+”(讀寫) | 打開(kāi)一個(gè)文件,在文件尾進(jìn)行讀寫 | 建立一個(gè)新的文件 |
“rb+”(讀寫) | 為了讀和寫打開(kāi)一個(gè)二進(jìn)制文件 | 出錯(cuò) |
“wb+”(讀寫) | 為了讀和寫,新建一個(gè)新的二進(jìn)制文件 | 建立一個(gè)新的文件 |
“ab+”(讀寫) | 打開(kāi)一個(gè)二進(jìn)制文件,在文件尾進(jìn)行讀和寫 | 建立一個(gè)新的文件 |
注:這里的輸入是指將數(shù)據(jù)寫到內(nèi)存中,輸出是寫到文件中
3.讀寫數(shù)據(jù)后使用fclose關(guān)閉文件。
int fclose ( FILE * stream );
// 示例 #include <stdio.h> int main () { FILE * pFile; //打開(kāi)文件 pFile = fopen ("myfile.txt","w"); //文件操作 if (pFile!=NULL) { fputs ("fopen example",pFile); //關(guān)閉文件 fclose (pFile); } return 0; }
4.文件的讀寫
現(xiàn)在我們知道了,如何去打開(kāi)一個(gè)文件,那么如何將它的數(shù)據(jù)輸入到程序中呢?
首先我想介紹一些函數(shù)
功能 | 函數(shù)名 | 適用于 |
---|---|---|
字符輸入函數(shù) | fgetc | 所有輸入流 |
字符輸出函數(shù) | fputc | 所有輸出流 |
文本行輸入函數(shù) | fgets | 所有輸入流 |
文本行輸出函數(shù) | fputs | 所有輸出流 |
格式化輸入函數(shù) | fscanf | 所有輸入流 |
格式化輸出函數(shù) | fprintf | 所有輸出流 |
二進(jìn)制輸入 | fread | 文件 |
二進(jìn)制輸出 | fwrite | 文件 |
看不懂? 沒(méi)關(guān)系,接下來(lái)我將用一個(gè)示例告訴你如何使用。
//這是我以前寫通信錄時(shí)用到的一些方法 typedef struct Contact { struct contact_person* data; int count; //通訊錄中人員個(gè)數(shù) int capacity; }Contact;//通訊錄類型的指針 void Save(Contact* con) //將數(shù)據(jù)存儲(chǔ)到文件中 { FILE* fp = fopen("contact.txt", "wb"); if (fp == NULL) { printf("Save()::%s", strerror(errno)); //如果打開(kāi)失敗,報(bào)錯(cuò) return; } else { fwrite(con->data, sizeof(struct contact_person), con->count, fp);//將數(shù)據(jù)寫到contect.txt中 } fclose(fp); //關(guān)閉文件 fp = NULL; } void Load(Contact* con) //將文件中的數(shù)據(jù)加載到內(nèi)存中 { 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的返回值為讀到數(shù)據(jù)的個(gè)數(shù),用來(lái)判斷是否繼續(xù)讀取 { Check_capacity(con);//檢測(cè)通訊錄容量是否足夠 con->data[con->count] = tmp; con->count++; } } fclose(fp); fp = NULL; }
到此這篇關(guān)于深入了解C語(yǔ)言中常見(jiàn)的文件操作方法的文章就介紹到這了,更多相關(guān)C語(yǔ)言文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
大家注意vector, list, set, map成員函數(shù)erase
set和map是由紅黑樹(shù)來(lái)實(shí)現(xiàn)的,當(dāng)erase的時(shí)候迭代器就失效了,也就是說(shuō)我們要在迭代器失效之前保留一個(gè)副本,根據(jù)這個(gè)副本我們才能繼續(xù)遍歷下一個(gè)元素2013-09-09C語(yǔ)言中g(shù)etchar的用法以及實(shí)例解析
getchar()是stdio.h中的庫(kù)函數(shù),它的作用是從stdin流中讀入一個(gè)字符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar的用法以及實(shí)例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03C語(yǔ)言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C++?計(jì)算時(shí)間差的五種方法小結(jié)
本文主要介紹了C++?計(jì)算時(shí)間差的五種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04