亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

什么是文件

程序文件

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

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

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

數(shù)據(jù)文件,一般指的是用來存儲(chǔ)我們?cè)谑褂脩?yīng)用程序的時(shí)候需要讀寫的數(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è)例子:我們上次寫過的簡(jiǎn)易通訊錄(簡(jiǎn)易版通訊錄),如果我們這一次運(yùn)行了這個(gè)程序,輸入了信息,但是沒有對(duì)數(shù)據(jù)進(jìn)行保存,關(guān)閉程序后,下次再次運(yùn)行程序,就看不到之前的數(shù)據(jù)了。

而我們想要的是,把通訊錄的信息記錄下來,只有我們自己選擇刪除數(shù)據(jù)的時(shí)候,數(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)自動(dòng)地在內(nèi)存中為程序中每一個(gè)正在使用的文件開辟一個(gè)“文件緩沖區(qū)”、

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

文件指針(FILE)

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

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

在編寫程序的時(shí)候,在打開文件的同時(shí),都會(huì)返回一個(gè)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

在這里插入圖片描述

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

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

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

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

fclose

在這里插入圖片描述

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

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

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

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

文件的打開方式

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

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

演示:

#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;
}

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

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

例子如下

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;
}

在這里插入圖片描述

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

需要注意的是,就像上面栗子那樣,只寫了文件名.后綴名,會(huì)默認(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)容,這樣就會(huì)導(dǎo)致失敗。如果要使用反斜杠,就要兩條反斜杠連在一起用。

以上就是我們?cè)谑褂靡粋€(gè)文件的時(shí)候的基本操作,先要打開文件,然后是對(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è)備(鍵盤)的通道。

標(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

在這里插入圖片描述

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

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

我們可以這樣理解

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

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

在這里插入圖片描述

fgets

在這里插入圖片描述

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

在這里插入圖片描述

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

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

相關(guān)文章

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

    使用C語言繪制柱形圖的示例代碼

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

    C語言簡(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)稱FIFO結(jié)構(gòu)。在隊(duì)尾添加元素,在隊(duì)頭刪除元素
    2022-04-04
  • C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考

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

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

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

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

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

    本篇文章對(duì)C++中的強(qiáng)制類型轉(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語言 野指針與空指針專篇解讀

    C語言 野指針與空指針專篇解讀

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

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

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

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

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

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

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

最新評(píng)論