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

C語言中炫酷的文件操作實(shí)例詳解

 更新時(shí)間:2021年10月17日 10:39:13   作者:針眼_  
內(nèi)存中的數(shù)據(jù)都是暫時(shí)的,當(dāng)程序結(jié)束時(shí),它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件操作的相關(guān)資料,需要的朋友可以參考下

什么是文件

磁盤上的文件是文件

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

程序文件

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

數(shù)據(jù)文件 (本文重點(diǎn))

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

文件名

文件就像人一樣,他也要有姓氏和名字來讓其他文件或者人知道這個(gè)文件是誰。

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

文件名格式:文件路徑+文件名主干+文件后綴

例如:D:\CSDN\Test.txt

為了方便起見,我們叫文件標(biāo)識為文件名

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

文件指針

我們知道,指針是指向一個(gè)地址的,整形指針指向一個(gè)整形的空間,數(shù)組指針指向一個(gè)數(shù)組的空間,那么文件指針自然就是指向文件的指針了。

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

這是再vs的stdio頭文件下的文件信息區(qū)結(jié)構(gòu)體

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;
//不同的C編譯器的FILE類型包含的內(nèi)容不完全相同,但是大同小異。

就像學(xué)生要有學(xué)號姓名年齡這些信息一樣,文件也有他的信息,比如這個(gè)文件的地址。這些信息存放于這個(gè)結(jié)構(gòu)體中,通過typedef重命名為FILE,并且我們不需要關(guān)心一些細(xì)節(jié)(你會關(guān)心我昨天晚上吃了什么嗎)。

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

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

FILE* pf;

pf通過該文件信息區(qū)中的信息就能夠訪問該文件。

也就是說,通過文件指針變量能夠找到與它關(guān)聯(lián)的文件。

但上面的文件指針并未指向明確的位置,他暫時(shí)是一個(gè)野指針

所以接下來,我們來學(xué)習(xí)如何打開(創(chuàng)建)一個(gè)文件。

文件函數(shù)

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

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

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

//打開文件
FILE* fopen(const char *filename,const char *mode);
//第一個(gè)參數(shù)是文件名,第二個(gè)參數(shù)是打開方式
//關(guān)閉文件
int Fclose(FILE *stream);

部分打開方式如下圖

在這里插入圖片描述

現(xiàn)在我們來練習(xí)一下打開文件

//打開文件
	FILE* pf = fopen("data.txt","r");
	//以只讀的方式打開這個(gè)文件
	//如果文件打開失敗會返回空,否則會返回指向該文件的指針
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//讀文件
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
	return 0;

在這里插入圖片描述

但是卻打開失敗了??!

原因是,從上面的打開方式一圖我們可以看出,以"r"方式打開,需要該文件真實(shí)存在,但是我并沒有創(chuàng)建這個(gè)文件,所以打開失敗了

叮~文件創(chuàng)建成功

我們再來看執(zhí)行結(jié)果

在這里插入圖片描述

這回沒有報(bào)錯(cuò)

但是,這里是將data.txt文件放在了該.c文件目錄下,在我將該文件放在別的地方,仍然打開失敗報(bào)錯(cuò)。

原因是,我們這段代碼只輸入了文件名,所以他只在當(dāng)前文件目錄下尋找該文件,在其他地方的文件我們就找不到了。

這里我們來看看兩個(gè)東西,一個(gè)叫相對路徑,一個(gè)叫絕對路徑

相對路徑與絕對路徑

 相對路徑

只認(rèn)為是當(dāng)前目錄下的文件,如上面的代碼中。

絕對路徑

帶上文件的從磁盤到目標(biāo)文件的路徑

例如

D:\Program Files\data.txt

但是請注意,在編程中,\是轉(zhuǎn)義字符,所以我們需要讓\不再是轉(zhuǎn)義字符,使其代表它本身

D:\Program Files\data.txt

輸入輸出流

什么是輸入輸出流

學(xué)習(xí)過編程,一定知道printf或者cout或者System.out.println吧,

這些函數(shù)用于打印數(shù)據(jù),這就是標(biāo)準(zhǔn)的輸出流。使數(shù)據(jù)輸出或者寫入文件中,我們叫輸出流。

我們打印HELLO WORLD在屏幕上,就是一個(gè)標(biāo)準(zhǔn)輸出流

像scanf之類的,從文件輸入或者讀數(shù)據(jù)到內(nèi)存中,就是輸入流。

一些基本的輸入輸出函數(shù)如下。

在這里插入圖片描述

比如,fputc就是寫一個(gè)字符進(jìn)去,fgetc就是讀一個(gè)字符。

//打開文件
	FILE* pf = fopen("data.txt","w");
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//讀文件
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	//fputc第一個(gè)參數(shù)為輸入的字符,第二個(gè)使對應(yīng)文件的指針

	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
	return 0;

在這里插入圖片描述

寫入了abc三個(gè)字符。

fputc和fgetc每次讀/寫一個(gè)字符后,文件指針pf會向后移動,類似strtok函數(shù)。會記錄上一次輸入/輸出的地址。

如果不這樣,那豈不是一直在一個(gè)位置重復(fù)寫入或者讀文件了。

接下來看看fgetc讀取字符

//打開文件
	FILE* pf = fopen("data.txt","r");
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//讀文件

	int a = fgetc(pf);
	printf("%c", a);
	a = fgetc(pf);
	printf("%c", a);
	a = fgetc(pf);
	printf("%c",a);
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
	return 0;

執(zhí)行結(jié)果

在這里插入圖片描述

這就是順序讀寫,按著順序讀入寫入。

當(dāng)然,有順序讀寫,就會有隨機(jī)讀寫

從字面意思就能看到,隨機(jī)讀寫emmm。

當(dāng)然,除了fgetc這類,fgets自然就是讀取一行了(只會讀/寫一行哦)

如果你用這類函數(shù)輸出在標(biāo)準(zhǔn)輸入或者標(biāo)準(zhǔn)輸入(stdout或者stdin)上,他和printf,scanf沒什么區(qū)別。

接下來,我們來看二進(jìn)制的讀和寫

二進(jìn)制讀寫

fwirte

在這里插入圖片描述

以二進(jìn)制的形式將內(nèi)容寫入文件中

第一個(gè)參數(shù)是你要寫入數(shù)據(jù)的數(shù)據(jù)地址,第二個(gè)參數(shù)是一個(gè)類型的大小(字節(jié))。第三個(gè)參數(shù)是你要寫入幾個(gè)數(shù)據(jù),第四個(gè)則是你選定寫入的流。

struct S{
	int n;
	double d;
	char name[10];
};

int main()
{
	struct S s = { 10, 3.14, "zhangsan" };
	//打開文件
	FILE* pf = fopen("data.txt","wb");
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//讀文件
	fwrite(&s,sizeof(s),1,pf);

	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
	return 0;
}

如上代碼會將數(shù)據(jù)以二進(jìn)制的形式寫入data.txt

雖然我們看不懂,但是能看到zhangsan是我們輸入的內(nèi)容

在這里插入圖片描述

fread

以二進(jìn)制的形式讀

在這里插入圖片描述

和fwirte一樣,只不過buffer不是const形式了,因?yàn)槲覀円獙?shù)據(jù)讀入該指針指向的目標(biāo)。

struct S{
	int n;
	double d;
	char name[10];
};

int main()
{
	struct S s = {0};
	//打開文件
	FILE* pf = fopen("data.txt","rb");
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//讀文件
	fread(&s,sizeof(struct S),1,pf);
	printf("%d  %lf  %s\n",s.n,s.d,s.name);

	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在這里插入圖片描述

總結(jié)

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

相關(guān)文章

  • C++中inline用法案例詳解

    C++中inline用法案例詳解

    這篇文章主要介紹了C++中inline用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++中I/O模型之select模型實(shí)例

    C++中I/O模型之select模型實(shí)例

    這篇文章主要介紹了C++中I/O模型的select模型,實(shí)例講述了I/O模型的用法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • OpenCV中findContours函數(shù)參數(shù)詳解

    OpenCV中findContours函數(shù)參數(shù)詳解

    Opencv中通過使用findContours函數(shù),簡單幾個(gè)的步驟就可以檢測出物體的輪廓,很方便。本文將和大家一起探討一下findContours方法中各參數(shù)的含義及用法,感興趣的可以了解一下
    2022-08-08
  • C語言輸出教學(xué)日歷表的方法實(shí)例

    C語言輸出教學(xué)日歷表的方法實(shí)例

    最近幫朋友做一些C語言的練習(xí)題,期間遇到了個(gè)比較有意思的題目,下面這篇文章主要給大家介紹了關(guān)于C語言輸出教學(xué)日歷表的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 深入解析C++編程中__alignof 與__uuidof運(yùn)算符的使用

    深入解析C++編程中__alignof 與__uuidof運(yùn)算符的使用

    這篇文章主要介紹了C++編程中__alignof 與__uuidof運(yùn)算符的使用,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • C++的深淺拷貝和寫時(shí)拷貝你了解嗎

    C++的深淺拷貝和寫時(shí)拷貝你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++的深淺拷貝和寫時(shí)拷貝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言運(yùn)用回調(diào)函數(shù)實(shí)現(xiàn)計(jì)算器

    C語言運(yùn)用回調(diào)函數(shù)實(shí)現(xiàn)計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了C語言運(yùn)用回調(diào)函數(shù)實(shí)現(xiàn)計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解

    數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解

    本篇文章是對在c語言中用棧實(shí)現(xiàn)表達(dá)式求值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實(shí)現(xiàn)通訊錄功能

    C語言實(shí)現(xiàn)通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)通訊錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C++實(shí)現(xiàn)逆波蘭式

    C++實(shí)現(xiàn)逆波蘭式

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)逆波蘭式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論

凌云县| 同江市| 东光县| 台南县| 新化县| 阿克苏市| 台江县| 永吉县| 罗山县| 息烽县| 龙井市| 边坝县| 滦南县| 凤城市| 许昌县| 九龙坡区| 吕梁市| 建昌县| 柘城县| 广水市| 望城县| 南丹县| 洛宁县| 新昌县| 合肥市| 秦皇岛市| 肇州县| 宁城县| 青龙| 武威市| 佛坪县| 娄底市| 双辽市| 深水埗区| 武功县| 阳朔县| 东至县| 呼图壁县| 巧家县| 安达市| 昌都县|