溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言中文件操作方法有哪些

發(fā)布時間:2022-03-04 11:16:44 來源:億速云 閱讀:224 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了C語言中文件操作方法有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

什么是文件

程序文件

其實(shí)從文件的功能的角度來說:我們的文件可以分為兩種類型的文件:程序文件和數(shù)據(jù)文件。

就拿我們C語言的程序?yàn)槔樱顺绦蛭募?,即后綴為.c的文件;目標(biāo)文件,即在windows環(huán)境下后綴為.obj的文件;可執(zhí)行程序文件,即后綴為.exe的文件。

數(shù)據(jù)文件

數(shù)據(jù)文件,一般指的是用來存儲我們在使用應(yīng)用程序的時候需要讀寫的數(shù)據(jù)的文件。

而我們討論的文件的操作也指的是數(shù)據(jù)文件的操作。

文件名

文件名通常由三部分組成:

文件路徑+文件名主干+文件后綴

C語言中文件操作方法有哪些

為什么要使用文件

我們在運(yùn)行程序的時候,總會產(chǎn)生一些數(shù)據(jù),如果我們不對數(shù)據(jù)進(jìn)行存儲,那么等待程序結(jié)束的時候,數(shù)據(jù)就會消失。

舉個例子:我們上次寫過的簡易通訊錄(簡易版通訊錄),如果我們這一次運(yùn)行了這個程序,輸入了信息,但是沒有對數(shù)據(jù)進(jìn)行保存,關(guān)閉程序后,下次再次運(yùn)行程序,就看不到之前的數(shù)據(jù)了。

而我們想要的是,把通訊錄的信息記錄下來,只有我們自己選擇刪除數(shù)據(jù)的時候,數(shù)據(jù)才不復(fù)存在。

而這就涉及到了數(shù)據(jù)持久化的問題,我們一般數(shù)據(jù)持久化的方法有,把數(shù)據(jù)存放在磁盤文件、存放到數(shù)據(jù)
庫等方式。

使用文件我們可以將數(shù)據(jù)直接存放在電腦的硬盤上,做到了數(shù)據(jù)的持久化。

文件的操作

文件緩沖區(qū)

C語言是使用“緩沖文件系統(tǒng)”來處理文本文件和二進(jìn)制文件。

緩沖文件系統(tǒng)就是指系統(tǒng)自動地在內(nèi)存中為程序中每一個正在使用的文件開辟一個“文件緩沖區(qū)”、

這個文件緩沖區(qū)就相當(dāng)于一個“中間人”,會在程序數(shù)據(jù)區(qū)和硬盤文件中充當(dāng)一個過渡者的身份。

文件指針(FILE)

緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針”,簡稱“文件指針”。

每個被使用的文件都在內(nèi)存中開辟了一個相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名
字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名FILE.

使用該結(jié)構(gòu)體類型來定義文件指針時,需要包含頭文件<stdio.h>。

需要注意的是,不同的C編譯器的FILE類型包含的內(nèi)容不完全相同,但是大同小異。

每當(dāng)打開一個文件的時候,系統(tǒng)會根據(jù)文件的情況自動創(chuàng)建一個FILE結(jié)構(gòu)的變量,并填充其中的信息,
我們作為使用者不必關(guān)心細(xì)節(jié)。

我們一般都是通過一個FILE的指針來維護(hù)這個FILE結(jié)構(gòu)的變量,這樣使用起來更加方便。

FILE* pf;//定義了一個文件指針變量

定義pf是一個指向FILE類型數(shù)據(jù)的指針變量。可以使pf指向某個文件的文件信息區(qū)(是一個結(jié)構(gòu)體變量)。通過該文件信息區(qū)中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關(guān)聯(lián)的文件。

C語言中文件操作方法有哪些

文件的打開和關(guān)閉

我們在對文件進(jìn)行讀寫之前應(yīng)該先打開文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件。

在編寫程序的時候,在打開文件的同時,都會返回一個FILE*的指針變量指向該文件,也相當(dāng)于建立了指針和文件的關(guān)系。

ANSIC 規(guī)定使用fopen函數(shù)來打開文件,fclose來關(guān)閉文件。

//打開文件
FILE * fopen ( const char * filename, const char * mode );
//關(guān)閉文件
int fclose ( FILE * stream );

fopen

C語言中文件操作方法有哪些

該函數(shù)包含在<stdio.h>頭文件中,用于打開文件的操作。

形參列表列表中的第一個參數(shù)是文件的名稱,第二個參數(shù)是文件的打開方式。

如果打開成功,我們就可以用一個文件指針來接收返回值,用于管理這個文件;如果打開失敗,就會返回一個空指針。

因此,我們再接收該函數(shù)返回值的時候,應(yīng)該加上一步檢驗(yàn)是否為空指針的操作。

fclose

C語言中文件操作方法有哪些

該函數(shù)同樣包含在<stdio.h>中

當(dāng)我們使用完文件的時候,記得要關(guān)閉文件。

我們通過fclose函數(shù),并把文件指針作為參數(shù)傳入即可。

如果關(guān)閉成功,該函數(shù)就返回0,如果關(guān)閉失敗,就會返回EOF(-1)。

文件的打開方式

文件有不同的打開方式,不同的打開方式對應(yīng)著不同的操作。

文件的使用方式含義如果指定文件不存在
“r”(只讀)為了輸入數(shù)據(jù),打開一個已經(jīng)存在的文本文件出錯
“w”(只寫)為了輸出數(shù)據(jù),打開一個文本文件建立一個新的文件
“a”(追加)向文本文件尾添加數(shù)據(jù)建立一個新的文件
“rb”(只讀)為了輸入數(shù)據(jù),打開一個二進(jìn)制文件出錯
“wb”(只寫)為了輸出數(shù)據(jù),打開一個二進(jìn)制文件建立一個新的文件
“ab”(追加)向一個二進(jìn)制文件尾添加數(shù)據(jù)出錯
“r+”(讀寫)為了讀和寫,打開一個文本文件出錯
“w+”(讀寫)為了讀和寫,建議一個新的文件建立一個新的文件
“a+”(讀寫)打開一個文件,在文件尾進(jìn)行讀寫建立一個新的文件
“rb+”(讀寫)為了讀和寫打開一個二進(jìn)制文件出錯
“wb+”(讀寫)為了讀和寫,新建一個新的二進(jìn)制文件建立一個新的文件
“ab+”(讀寫)打開一個二進(jìn)制文件,在文件尾進(jìn)行讀和寫建立一個新的文件

演示:

#include <stdio.h>
int main()
{
	FILE* pFile;
	//打開文件
	pFile = fopen("myfile.txt", "w");
	//文件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//關(guān)閉文件
		fclose(pFile);
	}
	return 0;
}

我們會看到,如果使用的是w的打開方式來使用文件的話,程序會在該代碼所在源文件的目錄下尋找你想要打開的文件,如果文件不存在的話,就會幫自動幫你創(chuàng)建一個。

但是,如果使用的打開方式是r,如果程序發(fā)現(xiàn)所在目錄不存在該文件,就會出錯。

例子如下

int main()
{
	FILE* pFile;
	//打開文件
	pFile = fopen("cmyfile.txt", "r");
	//文件操作
	if (pFile == NULL)
	{
		perror("fopen");
		return -1;
	}

	fputs("fopen example", pFile);
	//關(guān)閉文件
	fclose(pFile);
	return 0;
}

C語言中文件操作方法有哪些

當(dāng)我該源文件的文件夾中,并不存在這個文件時,就會出錯,并且我通過了perror這個函數(shù)把錯誤信息打印了出來。

需要注意的是,就像上面栗子那樣,只寫了文件名.后綴名,會默認(rèn)在該源文件所在的文件下進(jìn)行查找,如果需要指定目錄,則需要在文件名前面加上文件路徑。

例如

#include <stdio.h>
int main()
{
	FILE* pFile;
	//打開文件
	pFile = fopen("c:/program/test/myfile.txt", "w");
	//文件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//關(guān)閉文件
		fclose(pFile);
	}
	return 0;
}

注意

在C語言中,如果想要輸入路徑的話,我們一般使用斜杠(/),而不使用反斜杠(\),因?yàn)榉葱备苁寝D(zhuǎn)義的標(biāo)志,很有可能你的路徑中,剛好存在可以轉(zhuǎn)義的內(nèi)容,這樣就會導(dǎo)致失敗。如果要使用反斜杠,就要兩條反斜杠連在一起用。

以上就是我們在使用一個文件的時候的基本操作,先要打開文件,然后是對文件進(jìn)行操作,最后是關(guān)閉文件。

流的相關(guān)概念

流是個高度抽象的概念,我們可以理解為這就相當(dāng)于時一條通道,就像水流一樣,輸入流可以看作一個輸入通道,輸出流可以看作一個輸出通道。

流,這一條通道,連接的是程序和外部設(shè)備。

當(dāng)外部設(shè)備需要把數(shù)據(jù)輸入到程序的時候,就需要輸入流。

當(dāng)程序需要把數(shù)據(jù)輸出到外部設(shè)備的時候,就需要輸出流。

按照我個人的理解

標(biāo)準(zhǔn)輸入流,就是連接程序和標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)的通道。

標(biāo)準(zhǔn)輸出流,就是鏈接程序和標(biāo)準(zhǔn)輸出設(shè)備(屏幕)的通道。

文件的順序讀寫

順序讀寫,顧名思義,就是按照先后順序來進(jìn)行讀取和寫入的操作。

功能函數(shù)名適用于
字符輸入函數(shù)fgetc所有輸入流
字符輸出函數(shù)fputc所有輸出流
文本行輸入函數(shù)fgets所有輸入流
文本行輸出函數(shù)fputs所有輸出流
格式化輸入函數(shù)fscanf所有輸入流
格式化輸出函數(shù)fprintf所有輸出流
二進(jìn)制輸入fread文件
二進(jìn)制輸出fwrite文件

fputc

C語言中文件操作方法有哪些

這個函數(shù)包含在<stdio.h>中,該函數(shù)時一個字符一個字符的輸入的。

第一個參數(shù)是我們想要輸入的字符,第二個參數(shù)就是輸入流。

我們可以這樣理解

我們通過這個函數(shù),把想要輸入的字符,放到對應(yīng)的流中,然后這個流,會把這個字符送到對應(yīng)的設(shè)備上。

如果我們寫的是標(biāo)準(zhǔn)輸出流,那么就會把數(shù)據(jù)輸出到屏幕上,我們就可以再控制臺看見了。

C語言中文件操作方法有哪些

fgets

C語言中文件操作方法有哪些

該函數(shù)同樣包含在<stdio.h>中,該函數(shù)是從流中獲得一個字符。

C語言中文件操作方法有哪些

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C語言中文件操作方法有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI