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

C語言文件操作實(shí)現(xiàn)數(shù)據(jù)持久化(幫你快速了解文件操作函數(shù))

 更新時(shí)間:2022年11月08日 14:46:20   作者:Lizhihao_  
持久數(shù)據(jù)其實(shí)就是將數(shù)據(jù)保存到數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于C語言文件操作實(shí)現(xiàn)數(shù)據(jù)持久化(幫你快速了解文件操作函數(shù))的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一.了解文件

1.文件主要功能

  • 使用文件我們可以將數(shù)據(jù)直接存放在電腦的硬盤上,做到了數(shù)據(jù)的持久化。
  • 在以前各章所處理數(shù)據(jù)的輸入輸出都是以終端為對(duì)象的,即從終端的鍵盤輸入數(shù)據(jù),運(yùn)行結(jié)果顯示到顯 示器上。
  • 其實(shí)有時(shí)候我們會(huì)把信息輸出到磁盤上,當(dāng)需要的時(shí)候再?gòu)拇疟P上把數(shù)據(jù)讀取到內(nèi)存中使用,這里處理 的就是磁盤上文件。

2.什么是文件

磁盤上的文件是文件。

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

2.1程序文件

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

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

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

 2.3 文件名

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

比如: c:\code\test.txt

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

以下所有講的函數(shù)頭文件都是:#include <stdio.h>

1.文件指針

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

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

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

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

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

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

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

1.打開文件函數(shù):

代碼演示: 

FILE *pf = fopen("test.txt", "w");

文件名:

文件名分為兩種形式:

1.絕對(duì)路徑

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

2.相對(duì)路徑

文件名主干+文件后綴(也可以不加后綴)

相對(duì)路勁是在當(dā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è)新的文件

返回:

正確代碼書寫:

//打開文件
	FILE *pf = fopen("test.txt", "w");
	//文件是有可能打開失敗的,文件名出錯(cuò),打開方式問題等
	if (NULL == pf)
	{
		perror("fopen");
		return;
	}

只有打開文件就一定要搭配上判斷

2.關(guān)閉文件函數(shù)

代碼演示: 

fclose(pf);

正確的代碼規(guī)范:

int main()
{
	//打開文件
	FILE *pf = fopen("test.txt", "w");
	//文件是有可能打開失敗的,文件名出錯(cuò),打開方式問題等
	if (NULL == pf)
	{
		perror("fopen");
		return;
	}
 
	//寫文件
	//……
 
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;//防止再次使用此指針
 
	return 0;
}

三.順序讀寫文件函數(shù)

  • 這里的輸入是指把文件的數(shù)據(jù)輸入到程序內(nèi)存中
  • 輸出指的是內(nèi)存中的數(shù)據(jù),輸出到文件中

站在程序內(nèi)存的角度,把文件想成平時(shí)打印的cmd黑框就好

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

fputc字符輸入函數(shù)

函數(shù)原型:

補(bǔ)充:輸入流是什么 后面講現(xiàn)在你們看一下代碼就懂

函數(shù)代碼: 

這是我當(dāng)前文件下的一些文件,我講利用打開方式自動(dòng)創(chuàng)建一個(gè)文件

運(yùn)行程序前的文件夾:

 代碼:

#include<stdio.h>
int main()
{
	//打開文件
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//寫文件
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		fputc('a' + i, pf);//寫入26個(gè)字母
	}
	
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

運(yùn)行程序前的文件夾:

你們可以去看看是不是跟我打開的文件夾名相同,而且已經(jīng)在里面寫入了26個(gè)字母:

返回:

函數(shù)正常執(zhí)行返回所寫數(shù)據(jù),字符返回對(duì)應(yīng)ASII碼值

發(fā)生寫入錯(cuò)誤返回EOF

fgetc字符輸入函數(shù)

函數(shù)原型

返回:

函數(shù)正常執(zhí)行返回所寫數(shù)據(jù),字符返回對(duì)應(yīng)ASII碼值

發(fā)生寫入錯(cuò)誤返回EOF

代碼:

我會(huì)讀取剛剛fgetc輸入到文件中的數(shù)據(jù)

注意:我打開方式的變化

#include<stdio.h>int main(){//打開文件FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}//讀文件int ch;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}//關(guān)閉文件fclose(pf);pf = NULL;return 0;}

fgetc讀取了一個(gè)字符會(huì)自動(dòng)向后移動(dòng)一位

結(jié)果:

fputs文本行輸出函數(shù)

函數(shù)原型:

 返回:

代碼:

一次輸出一行

#include<stdio.h>
int main()
{
	//打開文件
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//寫文件
	fputs("hallo\n", pf);
	fputs("word", pf);
	
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

結(jié)果:

有此可見轉(zhuǎn)意字符\n等也是可以操作的

補(bǔ)充:因?yàn)槲募绞降脑驎?huì)把之前的數(shù)據(jù)覆蓋掉,成為新的數(shù)據(jù)如果想不覆蓋要用追加的方式打開,我現(xiàn)在把打開方式改為追加執(zhí)行

#include<stdio.h>
int main()
{
	//打開文件
	FILE* pf = fopen("test.txt", "a");//注意我把打開方式改為了追加a
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//寫文件
	fputs("hallo\n", pf);
	fputs("word", pf);
	
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

結(jié)果:

 還有一個(gè)二進(jìn)制的追加ab,其余打開方式請(qǐng)自行去查看上面的表格

fgets文本行輸入函數(shù)

函數(shù)原型:

 返回:

代碼:

一次輸入一行

#include<stdio.h>
int main()
{
	//打開文件
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//讀文件
	char arr[] = "#######################";//用來觀察一下的字符串
 
	fgets(arr, 20, pf);
	printf("%s", arr);//注意我這里沒有加\n因?yàn)橹暗妮斎肜锩媸禽斎脒M(jìn)去了\n的
	fgets(arr, 20, pf);
	printf("%s", arr);
 
 
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

注意我這里沒有加\n因?yàn)橹暗妮斎肜锩媸禽斎脒M(jìn)去了\n的

結(jié)果:

fprintf格式化輸出函數(shù)

函數(shù)原型:

 可以發(fā)現(xiàn)只是多了一個(gè)參數(shù)其余并沒有變化

返回:

代碼:

格式化輸出數(shù)據(jù)到文件中

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float scores;
};
 
int main()
{
	//打開文件
	struct S s = { "Laoli" ,20 ,95.5f };
 
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//寫文件
	fprintf(pf, "%s %d %f\n", s.name, s.age, s.scores);
 
 
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

這個(gè)字符在輸出字符串時(shí)遇到空格也會(huì)正常輸出

結(jié)果:

fscanf格式化輸入函數(shù)

函數(shù)原型: 

 返回:

代碼:

把剛剛放進(jìn)文件的數(shù)據(jù)格式化拿出來

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float scores;
 
};
 
int main()
{
	//打開文件
	struct S s = { 0 };
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//讀文件
	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.scores));
	printf("%s %d %f", s.name, s.age, s.scores);
 
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

結(jié)果:

這個(gè)函數(shù)在遇到空格會(huì)停止輸入所有項(xiàng),例如在Laoli中間加上空格:Lao li

fwrite二進(jìn)制輸出函數(shù)

函數(shù)原型: 

這個(gè)函數(shù)是以二進(jìn)制的方式進(jìn)行輸出的

 返回:

 代碼:

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float scores;
 
};
 
int main()
{
	//打開文件
	struct S s = { "Laoli" ,20 ,95.5f };
 
	FILE* pf = fopen("test.txt", "wb");//注意我已經(jīng)改變了文件的打卡方式
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//寫文件
	fwrite(&s, sizeof(struct S), 2, pf);
 
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return

注意我已經(jīng)改變了文件的打卡方式

結(jié)果:

大家可以看到除了字符串什么都看不懂呀,這個(gè)燙燙燙燙燙燙是什么鬼呀,其實(shí)是因?yàn)槎M(jìn)制的形式存儲(chǔ)的,計(jì)算機(jī)可以看懂就可以了,也可以利用fread函數(shù)查看內(nèi)容

fread二進(jìn)制輸入函數(shù)

函數(shù)原型:

返回:

代碼:

讀取剛剛存入文件的數(shù)據(jù),以二進(jìn)制形式讀取

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float scores;
 
};
 
int main()
{
	//打開文件
	struct S s = { 0 };
 
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//讀文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f", s.name, s.age, s.scores);
 
 
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

結(jié)果:

四. 解析上述的流

以上函數(shù)都是在文件流中拿信息,是需要fopen函數(shù)來打開的文件流

還幾個(gè)默認(rèn)打開的流:

 代碼:

五.文件的隨機(jī)讀寫

其實(shí)這些函數(shù)也并不是隨機(jī)的,也是有規(guī)律的,但不再是從開頭到結(jié)尾了

fseek

函數(shù)原型:

偏移量(字節(jié)為單位): 

向右移動(dòng)用正數(shù),向左移動(dòng)用負(fù)數(shù)

起始位置設(shè)置:

 返回:

代碼:

我手動(dòng)的在文件中添加這樣的數(shù)據(jù):

從末尾移動(dòng)三位取出數(shù)據(jù):

#include<stdio.h>
 
int main()
{
	//打開文件
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
 
	fseek(pf, -3, SEEK_END);
	int ch = fgetc(pf);
	printf("%c\n", ch);
 
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

ftell

功能:返回文件指針相對(duì)于起始位置的偏移量

 函數(shù)原型:

返回: 

成功返回當(dāng)前位置

 代碼:

我們就用剛剛的代碼加上函數(shù)試一下:

#include<stdio.h>
 
int main()
{
	//打開文件
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
 
	fseek(pf, -3, SEEK_END);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	int pos = ftell(pf);
	printf("%d", pos);
 
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

結(jié)果:

分析:

rewind

功能:讓文件指針的位置回到文件的起始位置

函數(shù)原型: 

代碼:

#include<stdio.h>
 
int main()
{
	//打開文件
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
 
	fseek(pf, -3, SEEK_END);
	int ch = fgetc(pf);
	printf("%c\n", ch);
 
	rewind(pf);//回到文件的起始位置
	int pos = ftell(pf);
	printf("%d", pos);
 
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

結(jié)果:

這個(gè)函數(shù)非常簡(jiǎn)單不做過多介紹了

此片文章設(shè)計(jì)大量函數(shù),記不住很正常,收藏一波需要的時(shí)候來查一查。

總結(jié)

到此這篇關(guān)于C語言文件操作實(shí)現(xiàn)數(shù)據(jù)持久化(幫你快速了解文件操作函數(shù))的文章就介紹到這了,更多相關(guān)C語言文件操作數(shù)據(jù)持久化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vc中SendMessage自定義消息函數(shù)用法實(shí)例

    vc中SendMessage自定義消息函數(shù)用法實(shí)例

    這篇文章主要介紹了vc中SendMessage自定義消息函數(shù)用法,以實(shí)例實(shí)行詳細(xì)講述了SendMessage的定義、原理與用法,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • Opencv圖像處理之圖像增加邊框

    Opencv圖像處理之圖像增加邊框

    這篇文章主要為大家詳細(xì)介紹了Opencv圖像處理之圖像增加邊框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • C語言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn)

    C語言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn)

    這篇文章主要介紹了C語言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++?vector的簡(jiǎn)單實(shí)現(xiàn)

    C++?vector的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C++?vector的簡(jiǎn)單實(shí)現(xiàn),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    貪吃蛇是曾經(jīng)諾基亞手機(jī)上很經(jīng)典很經(jīng)典的傳統(tǒng)老游戲,80.90后的童年時(shí)不多的游戲之一,跟電腦上的掃雷一樣,下面來從貪吃蛇手機(jī)游戲的前世今生講起
    2021-11-11
  • 詳解C++中多態(tài)的底層原理

    詳解C++中多態(tài)的底層原理

    要了解C++多態(tài)的底層原理需要我們對(duì)C指針有著深入的了解,這個(gè)在打印虛表的時(shí)候就可以見功底,所以快來跟隨小編一起學(xué)習(xí)一下吧
    2022-04-04
  • C/C++數(shù)據(jù)對(duì)齊詳細(xì)解析

    C/C++數(shù)據(jù)對(duì)齊詳細(xì)解析

    通常我們?cè)趯懘a的時(shí)候是不需要考慮對(duì)齊的影響的,都是依賴編譯器來為我們選擇適合的對(duì)齊策略,我們也可以通過傳遞給編譯器預(yù)編譯指令來指定數(shù)據(jù)對(duì)齊的方法
    2013-10-10
  • C語言中g(shù)etchar()的原理以及易錯(cuò)點(diǎn)解析

    C語言中g(shù)etchar()的原理以及易錯(cuò)點(diǎn)解析

    用getchar()函數(shù)讀取字符串時(shí),字符串會(huì)存儲(chǔ)在輸入緩沖區(qū)中,包括輸入的回車字符,下面這篇文章主要給大家介紹了關(guān)于C語言中g(shù)etchar()的原理以及易錯(cuò)點(diǎn)解析的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • C++異常處理方式實(shí)例詳解(超級(jí)詳細(xì)!)

    C++異常處理方式實(shí)例詳解(超級(jí)詳細(xì)!)

    程序有時(shí)會(huì)遇到運(yùn)行階段錯(cuò)誤,導(dǎo)致程序無法正常執(zhí)行下去,c++異常為處理這種情況提供了一種功能強(qiáng)大的而靈活的工具,下面這篇文章主要給大家介紹了關(guān)于C++異常處理方式的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • C/C++ Zlib庫封裝MyZip壓縮類的詳細(xì)過程

    C/C++ Zlib庫封裝MyZip壓縮類的詳細(xì)過程

    在軟件開發(fā)中,文件的壓縮和解壓縮是一項(xiàng)常見的任務(wù),而ZIP是一種被廣泛應(yīng)用的壓縮格式,本文將聚焦于一個(gè)簡(jiǎn)化的C++實(shí)現(xiàn),通過分析代碼,我們將深入了解其設(shè)計(jì)和實(shí)現(xiàn)細(xì)節(jié),感興趣的朋友一起看看吧
    2023-11-11

最新評(píng)論