最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年11月20日 09:33:53   作者:Ersansui  
在任何程序的開發(fā)中,對于文件的操作都是繞不開的一個知識點(diǎn),因為總是要用到存儲讀取的功能,今天我們來詳細(xì)了解C語言中是怎么操作文件的

什么是文件

程序文件

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

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

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

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

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

文件名

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

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

在這里插入圖片描述

為什么要使用文件

我們在運(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ù)的指針變量??梢允筽f指向某個文件的文件信息區(qū)(是一個結(jié)構(gòu)體變量)。通過該文件信息區(qū)中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關(guān)聯(lián)的文件。

在這里插入圖片描述

文件的打開和關(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

在這里插入圖片描述

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

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

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

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

fclose

在這里插入圖片描述

該函數(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;
}

在這里插入圖片描述

當(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語言中,如果想要輸入路徑的話,我們一般使用斜杠(/),而不使用反斜杠(\),因為反斜杠是轉(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

在這里插入圖片描述

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

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

我們可以這樣理解

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

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

在這里插入圖片描述

fgets

在這里插入圖片描述

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

在這里插入圖片描述

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

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

相關(guān)文章

  • C/C++自主分配出現(xiàn)double free or corruption問題解決

    C/C++自主分配出現(xiàn)double free or corruption問題解決

    這篇文章主要為大家介紹了C/C++出現(xiàn)double free or corruption問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • C++ 字符串去重排序?qū)嵗a

    C++ 字符串去重排序?qū)嵗a

    這篇文章主要介紹了C++ 字符串去重排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言將日期、時間保存到文本文件中的方法

    C語言將日期、時間保存到文本文件中的方法

    這篇文章主要給大家介紹了關(guān)于C語言將日期、時間保存到文本文件中的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C語言具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 如何實現(xiàn)socket網(wǎng)絡(luò)編程的多線程

    如何實現(xiàn)socket網(wǎng)絡(luò)編程的多線程

    首先,學(xué)好計算機(jī)網(wǎng)絡(luò)知識真的很重要。雖然,學(xué)不好不會影響理解下面這個關(guān)于宏觀講解,但是,學(xué)好了可以自己打漁吃,學(xué)不好就只能知道眼前有魚吃卻打不到漁。在Java中網(wǎng)絡(luò)程序有2種協(xié)議:TCP和UDP,下面可以和小編一起學(xué)習(xí)下
    2019-05-05
  • 詳解C++中虛析構(gòu)函數(shù)的作用及其原理分析

    詳解C++中虛析構(gòu)函數(shù)的作用及其原理分析

    這篇文章主要介紹了C++中虛析構(gòu)函數(shù)的作用及其原理分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C++私有繼承(二)

    C++私有繼承(二)

    這篇文章主要介紹了C++私有繼承,在私有繼承時,基類的公有對象以及保護(hù)對象會變成派生類的私有對象。我們可以在派生類方法當(dāng)中使用它,但無法通過派生類對象直接調(diào)用,但無法訪問基類的私有方法和對象,下面具體內(nèi)容,需要的朋友可以參考一下
    2022-01-01
  • C++實現(xiàn)線程池的簡單方法示例

    C++實現(xiàn)線程池的簡單方法示例

    這篇文章主要給大家介紹了關(guān)于C++實現(xiàn)線程池的簡單方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C++Smart Pointer 智能指針詳解

    C++Smart Pointer 智能指針詳解

    這篇文章主要為大家詳細(xì)介紹了C++Smart Pointer 智能指針,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++中的多態(tài)詳談

    C++中的多態(tài)詳談

    多態(tài)通俗來說就是多種形態(tài),本文通過實例代碼給大家介紹C++中的多態(tài)定義及實現(xiàn),通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-05-05
  • C++之OpenCV圖像高光調(diào)整具體流程

    C++之OpenCV圖像高光調(diào)整具體流程

    PS中的高光命令是一種校正由于太接近相機(jī)閃光燈而有些發(fā)白的焦點(diǎn)的方法,對高光區(qū)和非高光區(qū)的邊緣作平滑處理,接下來通過本文給大家分享C++之OpenCV圖像高光調(diào)整具體流程,感興趣的朋友一起看看吧
    2021-09-09

最新評論

彭泽县| 灵宝市| 盘山县| 广德县| 夏河县| 昌乐县| 铜梁县| 九江市| 平顺县| 桐庐县| 巴塘县| 浦江县| 民乐县| 隆德县| 温宿县| 冕宁县| 二连浩特市| 巢湖市| 和政县| 花垣县| 丘北县| 通州市| 布尔津县| 和田市| 南溪县| 延安市| 富顺县| 忻城县| 闸北区| 溧水县| 平乡县| 金山区| 苏尼特左旗| 自治县| 横峰县| 汽车| 黄山市| 乐平市| 沾化县| 滕州市| 兴隆县|