C語(yǔ)言實(shí)現(xiàn)對(duì)文件進(jìn)行操作的示例詳解
前言
文件操作
在運(yùn)行程序的時(shí)候,此時(shí)數(shù)據(jù)是存放在內(nèi)存中,當(dāng)程序退出的時(shí)候,程序中的數(shù)據(jù)自然就不存在了,等下次運(yùn)行程序的時(shí)候,數(shù)據(jù)又得重新錄入,我們可以用文件的辦法,把程序中的數(shù)據(jù)保存下來(lái),只有我們自己選擇刪除數(shù)據(jù)的時(shí)候,數(shù)據(jù)才不復(fù)存在。 這就涉及到了數(shù)據(jù)持久化的問(wèn)題,我們一般數(shù)據(jù)持久化的方法有,把數(shù)據(jù)存放在磁盤(pán)文件、存放到數(shù)據(jù)庫(kù)等方式。
文件指針
向文件里輸出或讀取數(shù)據(jù)需要使用文件指針的形式,每個(gè)文件指針可以用來(lái)打開(kāi)一個(gè)文件,這個(gè)文件指針指向文件的文件信息區(qū)。
FILE * 變量名
文件的打開(kāi)和關(guān)閉
文件使用完之后要記得關(guān)閉,不讓會(huì)占用資源,文件關(guān)閉掉之后要記得把指針置空以免出現(xiàn)野指針
//打開(kāi)文件 FILE * fopen ( const char * filename, const char * mode ); //關(guān)閉文件 int fclose ( FILE * stream );
文件的打開(kāi)方式
文件使用方式 文件使用方式 如果指定文件不存在
文件使用方式 | 文件使用方式 | 如果指定文件不存在 |
---|---|---|
“r”(只讀) | 為了輸入數(shù)據(jù),打開(kāi)一個(gè)已經(jīng)存在的文本文件 | 出錯(cuò) |
“w”(只寫(xiě)) | 為了輸出數(shù)據(jù),打開(kāi)一個(gè)文本文件 | 建立一個(gè)新的文件 |
“a”(追加) | 向文本文件尾添加數(shù)據(jù) | 建立一個(gè)新的文件 |
“rb”(只讀) | 為了輸入數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件 | 出錯(cuò) |
“wb”(只寫(xiě)) | 為了輸出數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件 | 建立一個(gè)新的文件 |
“ab”(追加) | 向一個(gè)二進(jìn)制文件尾添加數(shù)據(jù) | 出錯(cuò) |
“r+”(讀寫(xiě)) | 為了讀和寫(xiě),打開(kāi)一個(gè)文本文件 | 出錯(cuò) |
“w+”(讀寫(xiě)) | 為了讀和寫(xiě),建議一個(gè)新的文件 | 建立一個(gè)新的文件 |
“a+”(讀寫(xiě)) | 打開(kāi)一個(gè)文件,在文件尾進(jìn)行讀寫(xiě) | 建立一個(gè)新的文件 |
“rb+”(讀寫(xiě)) | 為了讀和寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件 | 出錯(cuò) |
“wb+”(讀寫(xiě)) | 為了讀和寫(xiě),新建一個(gè)新的二進(jìn)制文件 | 建立一個(gè)新的文件 |
“ab+”(讀寫(xiě)) | 打開(kāi)一個(gè)二進(jìn)制文件,在文件尾進(jìn)行讀和寫(xiě) | 建立一個(gè)新的文件 |
代碼示例
#include <stdio.h> int main() { FILE *pf = fopen("test.txt",'w'); if(pf==NULL) { perror("FOPEN:"); //對(duì)文件指針進(jìn)行判斷以免返回空指針; } fput("haohaoxuexi,tiantianxiangshang",pf); fclose(pf); pf=NULL; //文件關(guān)閉之后把指針置為空,以免出現(xiàn)野指針 }
‘ w ’ 沒(méi)有文件的情況下會(huì)新建一個(gè)文件在此程序文件夾下,可以看到文件已經(jīng)生成了。
文件讀寫(xiě)函數(shù)
功能 | 函數(shù)名 | 適用于 |
---|---|---|
字符輸入函數(shù) | fgetc | 所有輸入流 |
字符輸出函數(shù) | fputc | 所有輸出流 |
文本行輸入函數(shù) | fgets | 所有輸入流 |
文本行輸出函數(shù) | fputs | 所有輸出流 |
格式化輸入函數(shù) | fscanf | 所有輸入流 |
格式化輸出函數(shù) | fprintf | 所有輸出流 |
二進(jìn)制輸入 | fread | 文件 |
二進(jìn)制輸出 | fwrite | 文件 |
二進(jìn)制方式存儲(chǔ)文件
二進(jìn)制存儲(chǔ)在文件內(nèi)是查看不到具體信息的,要想在文件內(nèi)查看具體信息要選擇其他函數(shù)。
二進(jìn)制形式存儲(chǔ)代碼示例
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <malloc.h> struct student { char name[20]; int age; char adress[20]; }*s1; int main() { s1 = (struct student*)malloc(sizeof(struct student)); if (s1 == NULL) { perror("malloc:"); return 0; } FILE* pf = fopen("test.txt", "wb"); if (pf == NULL) { perror("FOPEN:"); //對(duì)文件指針進(jìn)行判斷以免返回空指針; return 0; } strcpy(s1->name, "陳獨(dú)秀"); s1->age = 18; strcpy(s1->adress,"東城區(qū)箭桿胡同20號(hào)"); fwrite(s1, sizeof(struct student), 1, pf); fclose(pf); pf = NULL; }
結(jié)果:
可以看到文件已經(jīng)出現(xiàn)了部分亂碼,還能看到文字的原因是文本文件打開(kāi)的時(shí)候默認(rèn)以一種編碼形式打開(kāi),將本來(lái)存到文本里的二進(jìn)制信息進(jìn)行了解碼。
對(duì)文件進(jìn)行拷貝
這里要注意\需要再用\轉(zhuǎn)義,否則是轉(zhuǎn)義字符的意思
- 先打開(kāi)要拷貝的文件,再打開(kāi)新建拷貝后的文件進(jìn)行拷貝
- 如果是圖片視頻等文件,要使用二進(jìn)制的方式打開(kāi)、讀取和存儲(chǔ),否則文件會(huì)損壞
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <malloc.h> int main() { FILE* pfr = fopen("C:\\Users\\22763\\Pictures\\Saved Pictures\\QQ圖片20211001085735.jpg", "rb"); //要拷貝的文件目錄 FILE* pfw = fopen("CopyPic.jpg", "wb"); char temp; if (pfw == NULL||pfr==NULL) { perror("FOPEN:"); //對(duì)文件指針進(jìn)行判斷以免返回空指針; return 0; } while (fread(&temp, sizeof(char), 1, pfr)) { fwrite(&temp, sizeof(char), 1, pfw); } fclose(pfw); fclose(pfr); pfw = NULL; pfr = NULL; }
文件隨機(jī)讀寫(xiě)函數(shù)
這三個(gè)函數(shù)并不常用,所有只要知道有這三個(gè)函數(shù)就行了以及他們是干什么的就可以了,用的時(shí)候再查。
fseek
int fseek(FILE stream,long offset,int origin );
根據(jù)文件指針的位置和偏移量來(lái)定位文件指針。
ftell
long ftell( FILE *stream );
返回文件指針相對(duì)于起始位置的偏移量
rewind
void rewind( FILE *stream );
讓文件指針的位置回到文件的起始位置
文件緩沖區(qū)
文件在讀或者寫(xiě)的時(shí)候存在一個(gè)文件緩沖區(qū),因?yàn)榕c磁盤(pán)交互,需要一定時(shí)間(盡管很短),但是為了盡可能的節(jié)省時(shí)間,系統(tǒng)自動(dòng)地在內(nèi)存中設(shè)立了文件緩沖區(qū),等攢夠一定的數(shù)據(jù),或者程序結(jié)束,一起讀或?qū)?,這樣大大提高讀寫(xiě)速度,避免每個(gè)字符都要進(jìn)行一次讀或?qū)憽?/p>
以上就是C語(yǔ)言實(shí)現(xiàn)對(duì)文件進(jìn)行操作的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言文件操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解C語(yǔ)言實(shí)現(xiàn)推箱子的基本功能(2)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)推箱子的基本功能的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn)
這篇文章主要介紹了C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn),幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-08-08C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能
這篇文章主要介紹了C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能,Ping命令被送到本地計(jì)算機(jī)的IP軟件,該命令永不退出該計(jì)算機(jī),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-08-08基于C語(yǔ)言實(shí)現(xiàn)計(jì)算生辰八字五行的示例詳解
生辰八字,簡(jiǎn)稱八字,是指一個(gè)人出生時(shí)的干支歷日期;年月日時(shí)共四柱干支,每柱兩字,合共八個(gè)字。這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)計(jì)算生辰八字五行的示例代碼,需要的可以參考一下2023-03-03詳解C++編程中的主表達(dá)式與后綴表達(dá)式編寫(xiě)基礎(chǔ)
這篇文章主要介紹了C++編程中的主表達(dá)式與后綴表達(dá)式編寫(xiě)基礎(chǔ),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01C語(yǔ)言調(diào)用攝像頭實(shí)現(xiàn)生成yuv未壓縮圖片
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何調(diào)用攝像頭實(shí)現(xiàn)生成yuv未壓縮圖片,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以參考一下2023-11-11OpenCV實(shí)現(xiàn)Sobel邊緣檢測(cè)的示例
本文主要介紹了OpenCV實(shí)現(xiàn)Sobel邊緣檢測(cè)的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08