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

C語(yǔ)言由淺入深講解文件的操作上篇

 更新時(shí)間:2022年04月01日 12:30:51   作者:_奇奇  
C語(yǔ)言具有操作文件的能力,比如打開(kāi)文件、讀取和追加數(shù)據(jù)、插入和刪除數(shù)據(jù)、關(guān)閉文件、刪除文件等。與其他編程語(yǔ)言相比,C語(yǔ)言文件操作的接口相當(dāng)簡(jiǎn)單和易學(xué)

為什么使用文件

前面寫(xiě)的通訊錄,增加人數(shù)退出程序后,數(shù)據(jù)就會(huì)消失。此時(shí)數(shù)據(jù)是存放在內(nèi)存中,下次運(yùn)行通訊錄程序的時(shí)候,數(shù)據(jù)又得重新錄入,如果使用這樣的通訊錄就很難受。

所以文件操作就應(yīng)運(yùn)而生。數(shù)據(jù)持久化的方法有兩種:1.把數(shù)據(jù)存放在磁盤(pán)文件2.存放到數(shù)據(jù)庫(kù)使用文件我們們可以將數(shù)據(jù)直接存放在電腦的硬盤(pán)上,做到了數(shù)據(jù)的持久化。

什么是文件

但是在程序設(shè)計(jì)中,我們一般談的文件有兩種:程序文件、數(shù)據(jù)文件(從文件功能的角度來(lái)分類的)。

程序文件:包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。

數(shù)據(jù)文件:文件的內(nèi)容不一定是程序,而是程序運(yùn)行時(shí)讀寫(xiě)的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件,或者輸出內(nèi)容的文件。

在以前各章所處理數(shù)據(jù)的輸入輸出都是以終端為對(duì)象的,即從終端的鍵盤(pán)輸入數(shù)據(jù),運(yùn)行結(jié)果顯示到顯示器上。

其實(shí)有時(shí)候我們會(huì)把信息輸出到磁盤(pán)上,當(dāng)需要的時(shí)候再?gòu)拇疟P(pán)上把數(shù)據(jù)讀取到內(nèi)存中使用,這里處理的就是磁盤(pán)上文件。

文件名

一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),以便用戶識(shí)別和引用。

文件名包含3部分:文件路徑+文件名主干+文件后綴

例如: c:\code\test.txt

為了方便起見(jiàn),文件標(biāo)識(shí)常被稱為文件名。

關(guān)于文件的一些概念

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

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

VS2013編譯環(huán)境提供的 stdio.h 頭文件中有以下的文件類型申明;

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
       };
typedef struct _iobuf FILE;

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

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

下面我們可以創(chuàng)建一個(gè)FILE*的指針變量:

FILE* pf;//文件指針變量

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

在這里插入圖片描述

規(guī)定:文件在讀寫(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)閉文件

首先理解 讀和寫(xiě) 是什么意思。

寫(xiě)文件:將內(nèi)存的數(shù)據(jù) 輸出 到文件或屏幕上。

讀文件:將文件或鍵盤(pán)的數(shù)據(jù) 輸入 到內(nèi)存中。

在這里插入圖片描述

文件函數(shù)

fopen

函數(shù)原型:

FILE *fopen( const char *filename, const char *mode );

函數(shù)功能:Open a file.

該函數(shù)的功能就是打開(kāi)一個(gè)文件,函數(shù)的第一個(gè)參數(shù)是你要打開(kāi)的文件的文件名,第二個(gè)參數(shù)是打開(kāi)這個(gè)文件的形式。

返回值:Each of these functions returns a pointer to the open file. A null pointer value indicates an error.

返回一個(gè)指向文件的指針,如果打開(kāi)錯(cuò)誤返回空指針。

注意:需要檢查fopen返回值的有效性

	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return;//失敗返回
	}

fclose

函數(shù)原型:

int fclose( FILE *stream );

函數(shù)功能

Closes a stream (fclose) .

關(guān)閉一個(gè)流

返回值:fclose returns 0 if the stream is successfully closed.return EOF to indicate an errorreturn 0

如果流成功關(guān)閉,返回EOF(-1)如果失敗。

實(shí)例代碼

	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;//失敗返回
	}

絕對(duì)路徑

絕對(duì)路徑就是在具體文件的位置。例如:

D:\c-language\c yuyan\c yuyan\data.txt

FILE* pf = fopen("D:\\c-language\\c yuyan\\c yuyan\data.txt", "r");

但是為了防止字符串中的’\‘及其后面的字符被整體視為為轉(zhuǎn)義字符,所以需要在每個(gè)’\‘后面再加一個(gè)’\’。

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

前三個(gè)是常用的方式。

規(guī)則:

文件打開(kāi)方式含義
“r” (只讀)打開(kāi)文件進(jìn)行輸入操作。如不存在將會(huì)報(bào)錯(cuò)。
“w” (只寫(xiě))為了輸出數(shù)據(jù),打開(kāi)一個(gè)文本文件。如存在,則清空里面的數(shù)據(jù)并輸出。如不存在將建立一個(gè)新的文件。
“a” (追加)向文本文件尾添加數(shù)據(jù)。如果文件不存在,則創(chuàng)建該文件。
“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ě))打開(kāi)一個(gè)文件進(jìn)行更新(輸入和輸出)。如不存在則出錯(cuò)。
“w+”(讀寫(xiě))建一個(gè)空文件并打開(kāi)它以進(jìn)行更新(輸入和輸出)。如果同名文件已經(jīng)存在,則將丟棄其內(nèi)容,并且該文件將被視為新的空文件。
“a+”(讀寫(xiě))打開(kāi)一個(gè)文件,在文件尾進(jìn)行讀寫(xiě)。如不存在建立一個(gè)新文件。

文件操作流程

以下是對(duì)文件操作的一般流程。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	//打開(kāi)文件
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//對(duì)文件進(jìn)行一系列操作
	......
	.....
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;置空
	return 0;
}

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

相關(guān)文章

  • C++嵌入式內(nèi)存管理詳情

    C++嵌入式內(nèi)存管理詳情

    這篇文章主要介紹了C++嵌入式內(nèi)存管理,是對(duì)上一篇內(nèi)存的一個(gè)補(bǔ)充,主要講解Linux中的內(nèi)存;這部分對(duì)于一些端側(cè)部署的伙伴來(lái)說(shuō)比較重要,推薦針對(duì)不同的板子,下面來(lái)看看詳細(xì)內(nèi)容吧,需要的朋友可以參考一下
    2021-12-12
  • C++報(bào)錯(cuò) XX does not name a type;field `XX’ has incomplete type的解決方案

    C++報(bào)錯(cuò) XX does not name a type;

    這篇文章主要給大家介紹了C++報(bào)錯(cuò) XX does not name a type;field `XX’ has incomplete type解決方案,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 如何用c語(yǔ)言完成俄羅斯方塊小游戲

    如何用c語(yǔ)言完成俄羅斯方塊小游戲

    這篇文章主要介紹了如何使用C語(yǔ)言開(kāi)發(fā)一個(gè)簡(jiǎn)單的俄羅斯方塊游戲,涵蓋了游戲設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)、核心邏輯和實(shí)現(xiàn)步驟,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼

    QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼

    本文主要介紹了QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 函數(shù)式宏定義與普通函數(shù)的區(qū)別

    函數(shù)式宏定義與普通函數(shù)的區(qū)別

    盡管函數(shù)式宏定義和普通函數(shù)相比有很多缺點(diǎn),但只要小心使用還是會(huì)顯著提高代碼的執(zhí)行效率,畢竟省去了分配和釋放棧幀、傳參、傳返回值等一系列工作,因此那些簡(jiǎn)短并且被頻繁調(diào)用的函數(shù)經(jīng)常用函數(shù)式宏定義來(lái)代替實(shí)現(xiàn)
    2013-10-10
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列算法詳解

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列算法詳解

    這篇文章介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的算法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 詳解c++20協(xié)程如何使用

    詳解c++20協(xié)程如何使用

    這篇文章主要介紹了詳解c++20協(xié)程如何使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++利用MySQL API連接和操作數(shù)據(jù)庫(kù)實(shí)例詳解

    C++利用MySQL API連接和操作數(shù)據(jù)庫(kù)實(shí)例詳解

    這篇文章主要介紹了C++利用MySQL API連接和操作數(shù)據(jù)庫(kù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 淺談C++11中的幾種鎖

    淺談C++11中的幾種鎖

    本文主要介紹了C++11中的幾種鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言中各種運(yùn)算類型全面總結(jié)

    C語(yǔ)言中各種運(yùn)算類型全面總結(jié)

    C語(yǔ)言運(yùn)算符是說(shuō)明特定操作的符號(hào),它是構(gòu)造C語(yǔ)言表達(dá)式的工具,C語(yǔ)言的運(yùn)算異常豐富,除了控制語(yǔ)句和輸入輸出以外的幾乎所有的基本操作都為運(yùn)算符處理
    2022-04-04

最新評(píng)論

大姚县| 临海市| 龙岩市| 合阳县| 绥化市| 孝昌县| 东安县| 济宁市| 临高县| 宾阳县| 高邮市| 怀柔区| 石河子市| 武强县| 彰化县| 伊吾县| 潮州市| 灌南县| 大宁县| 古丈县| 尚志市| 镇巴县| 依安县| 阳东县| 麻阳| 福鼎市| 浦县| 南平市| 宾阳县| 白水县| 沙河市| 大连市| 舒城县| 台山市| 织金县| 吴旗县| 米林县| 天镇县| 万荣县| 铜山县| 上虞市|