欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言關(guān)于文件的操作方法總結(jié)

 更新時(shí)間:2021年11月20日 09:33:53   作者:Ersansui  
在任何程序的開(kāi)發(fā)中,對(duì)于文件的操作都是繞不開(kāi)的一個(gè)知識(shí)點(diǎn),因?yàn)榭偸且玫酱鎯?chǔ)讀取的功能,今天我們來(lái)詳細(xì)了解C語(yǔ)言中是怎么操作文件的

什么是文件

程序文件

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

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

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

數(shù)據(jù)文件,一般指的是用來(lái)存儲(chǔ)我們?cè)谑褂脩?yīng)用程序的時(shí)候需要讀寫(xiě)的數(shù)據(jù)的文件。

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

文件名

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

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

在這里插入圖片描述

為什么要使用文件

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

舉個(gè)例子:我們上次寫(xiě)過(guò)的簡(jiǎn)易通訊錄(簡(jiǎn)易版通訊錄),如果我們這一次運(yùn)行了這個(gè)程序,輸入了信息,但是沒(méi)有對(duì)數(shù)據(jù)進(jìn)行保存,關(guān)閉程序后,下次再次運(yùn)行程序,就看不到之前的數(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ù)直接存放在電腦的硬盤(pán)上,做到了數(shù)據(jù)的持久化。

文件的操作

文件緩沖區(qū)

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

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

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

文件指針(FILE)

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

我們?cè)趯?duì)文件進(jìn)行讀寫(xiě)之前應(yīng)該先打開(kāi)文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件。

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

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

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

fopen

在這里插入圖片描述

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

形參列表列表中的第一個(gè)參數(shù)是文件的名稱(chēng),第二個(gè)參數(shù)是文件的打開(kāi)方式。

如果打開(kāi)成功,我們就可以用一個(gè)文件指針來(lái)接收返回值,用于管理這個(gè)文件;如果打開(kāi)失敗,就會(huì)返回一個(gè)空指針。

因此,我們?cè)俳邮赵摵瘮?shù)返回值的時(shí)候,應(yīng)該加上一步檢驗(yàn)是否為空指針的操作。

fclose

在這里插入圖片描述

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

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

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

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

文件的打開(kāi)方式

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

文件的使用方式 含義 如果指定文件不存在
“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* pFile;
	//打開(kāi)文件
	pFile = fopen("myfile.txt", "w");
	//文件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//關(guān)閉文件
		fclose(pFile);
	}
	return 0;
}

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

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

例子如下

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

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

在這里插入圖片描述

當(dāng)我該源文件的文件夾中,并不存在這個(gè)文件時(shí),就會(huì)出錯(cuò),并且我通過(guò)了perror這個(gè)函數(shù)把錯(cuò)誤信息打印了出來(lái)。

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

例如

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

注意

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

以上就是我們?cè)谑褂靡粋€(gè)文件的時(shí)候的基本操作,先要打開(kāi)文件,然后是對(duì)文件進(jìn)行操作,最后是關(guān)閉文件。

流的相關(guān)概念

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

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

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

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

按照我個(gè)人的理解

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

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

文件的順序讀寫(xiě)

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

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

fputc

在這里插入圖片描述

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

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

我們可以這樣理解

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

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

在這里插入圖片描述

fgets

在這里插入圖片描述

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

在這里插入圖片描述

還有剩下的函數(shù),就不一一舉例了,使用方法都大同小異。

到此這篇關(guān)于C語(yǔ)言關(guān)于文件的操作方法總結(jié)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C語(yǔ)言繪制柱形圖的示例代碼

    使用C語(yǔ)言繪制柱形圖的示例代碼

    常用的統(tǒng)計(jì)圖有條形圖、柱形圖、折線圖、曲線圖、餅圖、環(huán)形圖、扇形圖,這篇文章主要為大家介紹了C語(yǔ)言中繪制條形圖和柱形圖的方法,需要的可以參考下
    2024-02-02
  • C語(yǔ)言簡(jiǎn)明講解隊(duì)列的實(shí)現(xiàn)方法

    C語(yǔ)言簡(jiǎn)明講解隊(duì)列的實(shí)現(xiàn)方法

    隊(duì)列(Queue)與棧一樣,是一種線性存儲(chǔ)結(jié)構(gòu),它具有如下特點(diǎn):隊(duì)列中的數(shù)據(jù)元素遵循“先進(jìn)先出”(First?In?First?Out)的原則,簡(jiǎn)稱(chēng)FIFO結(jié)構(gòu)。在隊(duì)尾添加元素,在隊(duì)頭刪除元素
    2022-04-04
  • C++實(shí)踐數(shù)組類(lèi)運(yùn)算的實(shí)現(xiàn)參考

    C++實(shí)踐數(shù)組類(lèi)運(yùn)算的實(shí)現(xiàn)參考

    今天小編就為大家分享一篇關(guān)于C++實(shí)踐數(shù)組類(lèi)運(yùn)算的實(shí)現(xiàn)參考,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Matlab實(shí)現(xiàn)鼠標(biāo)光標(biāo)變成愛(ài)心和瞄準(zhǔn)鏡形狀

    Matlab實(shí)現(xiàn)鼠標(biāo)光標(biāo)變成愛(ài)心和瞄準(zhǔn)鏡形狀

    這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)將鼠標(biāo)光標(biāo)變成愛(ài)心和瞄準(zhǔn)鏡等形狀,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • 基于c++強(qiáng)制類(lèi)型轉(zhuǎn)換的(總結(jié))詳解

    基于c++強(qiáng)制類(lèi)型轉(zhuǎn)換的(總結(jié))詳解

    本篇文章對(duì)C++中的強(qiáng)制類(lèi)型轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • C++11的functional模塊介紹和使用案例

    C++11的functional模塊介紹和使用案例

    functional模塊是C++ 11提供了一組函數(shù)對(duì)象和算法,用于增強(qiáng)C++的函數(shù)式編程能力,本文主要介紹了C++11的functional模塊介紹和使用案例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • C語(yǔ)言 野指針與空指針專(zhuān)篇解讀

    C語(yǔ)言 野指針與空指針專(zhuān)篇解讀

    全網(wǎng)最接地氣的C語(yǔ)言野指針介紹,此處對(duì)于野指針與空指針知識(shí)點(diǎn)做一些簡(jiǎn)要的介紹,作者實(shí)屬初學(xué),寫(xiě)博客也是作者學(xué)習(xí)的一個(gè)過(guò)程,難免文章中有內(nèi)容理解不到位或者有不當(dāng)之處,還請(qǐng)朋友們不吝指正,希望大家多多給予支持,贈(zèng)人玫瑰,手有余香
    2021-11-11
  • C++運(yùn)行時(shí)類(lèi)型識(shí)別與轉(zhuǎn)換實(shí)現(xiàn)方法

    C++運(yùn)行時(shí)類(lèi)型識(shí)別與轉(zhuǎn)換實(shí)現(xiàn)方法

    運(yùn)行時(shí)類(lèi)型識(shí)別可能被認(rèn)為是C++中一個(gè)”次要“的特征,當(dāng)程序員在編程過(guò)程中陷入非常困難的境地時(shí),實(shí)用主義將會(huì)幫助他走出困境
    2022-10-10
  • VTK8.1?在?Qt5.9?環(huán)境下的配置編譯和安裝過(guò)程

    VTK8.1?在?Qt5.9?環(huán)境下的配置編譯和安裝過(guò)程

    為了實(shí)現(xiàn)realsense的PCL點(diǎn)云顯示,需要VTK支持。由于整個(gè)平臺(tái)在Qt環(huán)境實(shí)現(xiàn),VTK編譯為Qt插件。整個(gè)過(guò)程并不復(fù)雜,網(wǎng)上的文章大多不全,自己梳理了一下,分享出來(lái),需要的朋友可以參考下
    2022-07-07
  • 詳解C++-二階構(gòu)造模式、友元

    詳解C++-二階構(gòu)造模式、友元

    這篇文章主要介紹了C++-二階構(gòu)造模式、友元,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論