亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

文件操作(文件指針+順序讀寫函數(shù)詳解)

LiveVideoStack / 3281人閱讀

摘要:該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名例如編譯環(huán)境提供的頭文件中有以下的文件類型聲明每當(dāng)打開(kāi)一個(gè)文件的時(shí)候,系統(tǒng)會(huì)根據(jù)文件的情況自動(dòng)創(chuàng)建一個(gè)結(jié)構(gòu)的變量,并填充其中的信息,使用者不必關(guān)心細(xì)節(jié)。

一、文件

什么是文件:

磁盤上的文件就是文件

1、以文件功能分類:

程序文件:

源程序文件test.c 目標(biāo)文件test.obj 可執(zhí)行程序test.exe

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

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

2、文件名

一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),以便用戶識(shí)別和引用。
文件名包含3部分:文件路徑+文件名主干+文件后綴
例如: c:/code/test.txt
為了方便起見(jiàn),文件標(biāo)識(shí)常被稱為文件名。



二、文件指針

每一個(gè)打開(kāi)的文件都會(huì)后一個(gè)與它匹配的文件信息區(qū),存儲(chǔ)文件信息
這些信息保存在一個(gè)結(jié)構(gòu)體變量中,如:struct FILE f;。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名FILE.

例如,VS2008編譯環(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é)。
一般都是通過(guò)一個(gè)FILE的指針來(lái)維護(hù)這個(gè)FILE結(jié)構(gòu)的變量,這樣使用起來(lái)更加方便。



三、文件的打開(kāi)和關(guān)閉

1、fopen fclose

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



2、“r” - 讀

#include int main(){	FILE* pf = fopen("data.txt", "r");	if (pf == NULL)	{		perror("fopen"); 		// 輸出:		// fopen: No such file or directory		// 因?yàn)槲募淮嬖?/span>		return -1;	}	// 讀文件	// 關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}

絕對(duì)路徑

#include int main(){	FILE* pf = fopen("C://Users//Chloe//Desktop//data.txt", "r"); // 絕對(duì)路徑	// FILE* pf = fopen("data.txt", "r"); // 相對(duì)路徑	if (pf == NULL)	{		perror("fopen");		return -1;	}	// 讀文件	// 關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}


3、“w” - 寫

#include int main(){	FILE* pf = fopen("C://Users//Chloe//Desktop//data.txt", "w"); // 會(huì)生成一個(gè)文件	if (pf == NULL)	{		perror("fopen");		return -1;	}	// 讀文件	// 關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}


四、順序讀寫

1、有哪些函數(shù)

fputc - 字符輸出函數(shù) 寫一個(gè)字符
fgetc - 字符輸入函數(shù) 讀一個(gè)字符



2、fputc - 字符輸出(寫)

int fgetc( FILE *stream );

#include int main(){	FILE* pf = fopen ("C://Users//Chloe//Desktop//data.txt", "w");	if (NULL == pf)	{		perror("fopen");		return -1;	}	// 寫文件	fputc("b", pf); // 在data.txt中寫入bit	fputc("i", pf);	fputc("t", pf);	// 關(guān)閉文件	fclose(pf);	pf = NULL;	 	return 0;}

2.1、所有輸出流

流:高度抽象的概念

 C語(yǔ)言的程序,只要運(yùn)行起來(lái),就默認(rèn)打開(kāi)了三個(gè)流: stdout - 標(biāo)準(zhǔn)輸出流 stdin  - 標(biāo)準(zhǔn)輸入流 stderr - 標(biāo)準(zhǔn)錯(cuò)誤流 類型都是 FILE*

#include int main(){	fputc("b", stdout);	fputc("i", stdout);	fputc("t", stdout);}



3、fgetc - 字符輸入(讀)

int fputc( int c, FILE *stream );


3.1、從文件里讀

把文件內(nèi)容改成abcdef 會(huì)輸出什么?

#include int main(){	FILE* pf = fopen ("C://Users//Chloe//Desktop//data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	// 讀文件	int ch = fgetc(pf);                                            	printf("%c/n", ch); // a	ch = fgetc(pf);	printf("%c/n", ch); // b	ch = fgetc(pf);	printf("%c/n", ch); // c	// 關(guān)閉文件	fclose(pf);	pf = NULL;	 	return 0;}

3.2、從標(biāo)準(zhǔn)輸入讀

也可以從標(biāo)準(zhǔn)輸入讀,也就是鍵盤

#include int main(){	int ch = fgetc(stdin);	printf("%c/n", ch);	ch = fgetc(stdin);	printf("%c/n", ch);	ch = fgetc(stdin);	printf("%c/n", ch);}



4、對(duì)比putchar printf getchar scanf

#include int main(){	fputc("b", stdout);	// putchar printf("%c", ch);	int ch = fgetc(stdin);	// getchar scanf("%c", ch);	printf("%c/n", ch);}


5、fputs - 文本輸出(寫)

int fputs( const char *string, FILE *stream );

把數(shù)據(jù)放進(jìn)流里

#include int main(){	FILE* pf = fopen("data.txt", "w");	if (NULL == pf)	{		perror("fopen");		return -1;	}	// 寫文件	// 寫一行數(shù)據(jù)	fputs("hello world/n", pf);	fputs("hello bit/n", pf);	fclose(pf);	pf = NULL;}



6、fgets - 文本輸入(讀)

char *fgets( char *string, int n, FILE *stream );

從流里讀數(shù)據(jù)


使用示例:

想要讀5個(gè)字符,但實(shí)際只讀了4個(gè)字符,因?yàn)楹竺婧笥幸粋€(gè) /0

改成20:



7、fprintf - 格式化輸出

int fprintf( FILE *stream, const char *format [, argument ]...);

與 printf 函數(shù)對(duì)比

示例:

#include struct S{	int n;	double d;};int main(){	struct S s = { 100, 3.14 };	FILE* pf = fopen("data.txt", "w");	if (NULL == pf)	{		perror("fopen");		return -1;	}	// 寫文件	fprintf(pf, "%d %lf", s.n, s.d);	// 關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}



8、fscanf - 格式化輸入

int fscanf( FILE *stream, const char *format [, argument ]... );

與 printf 函數(shù)對(duì)比

示例:

#include struct S{	int n;	double d;};int main(){	struct S s = { 0 };	FILE* pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	// 讀文件	fscanf(pf, "%d %lf", &(s.n), &(s.d));		printf("%d %lf", s.n, s.d);	// 關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}



9、fwrite - 二進(jìn)制輸出

示例:

wb”(只寫) 為了輸出數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件

#include struct S{	int n;	double d;	char name[10];};int main(){	struct S s = { 100, 3.24, "zhangsan"};	FILE* pf = fopen("data.txt", "wb");	if (NULL == pf)	{		perror("fopen");		return -1;	}	// 以二進(jìn)制方式寫	fwrite(&s, sizeof(s), 1, pf);	// 關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}

文件內(nèi)輸出一堆二進(jìn)制



10、fread - 二進(jìn)制輸入

示例:

#include struct S{	int n;	double d;	char name[10];};int main(){	struct S s = { 100, 3.24, "zhangsan" };	FILE* pf = fopen("data.txt", "rb");	if (NULL == pf)	{		perror("fopen");		return -1;	}	// 讀文件 - 以二進(jìn)制方式讀	fwrite(&s, sizeof(s), 1, pf);	// 打印文件	printf("%d %lf %s/n", s.n, s.d, s.name); // 100 3.240000 zhangsan	// 關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}


11、對(duì)比一組函數(shù)

scanf/fscanf/sscanfprintf/fprintf/sprintf

scanf:從標(biāo)準(zhǔn)輸入流(鍵盤)讀取格式化的數(shù)據(jù)
printf:把格式化的數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出(屏幕)上

fscanf:從所有的輸入流讀取格式化的數(shù)據(jù)
fprintf:把格式化的數(shù)據(jù)輸出到所有輸出流(屏幕 / 文件)上

剩下 sscanf 和 sprintf 是什么意思?



sscanf 與 sprintf

從一個(gè)字符串里讀格式化的數(shù)據(jù)
寫格式化的數(shù)據(jù)到字符串里

舉例:

#include struct S{	int n;	double d;	char name[10];};int main(){	char arr[100] = { 0 };	struct S s = { 100, 3.14, "zhangsan" };	// 把一個(gè)格式化的數(shù)據(jù)轉(zhuǎn)換成字符串	sprintf(arr, "%d %lf %s/n", s.n, s.d, s.name);	//  打印	printf("%s/n", arr);	return 0;}
輸出:
100 3.140000 zhangsan
由此可見(jiàn) sprintf 的作用是:
把格式化的數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的字符串

如何從arr里解析出格式化的結(jié)構(gòu)體放進(jìn)tmp:

#include struct S{	int n;	double d;	char name[10];};int main(){	char arr[100] = { 0 };	struct S s = { 100, 3.14, "zhangsan" };	struct S tmp = { 0 };	// 把一個(gè)格式化的數(shù)據(jù)轉(zhuǎn)換成字符串	sprintf(arr, "%d %lf %s/n", s.n, s.d, s.name);	// 以字符串形式打印	printf("%s/n", arr); // 100 3.140000 zhangsan	// 從arr中的字符串中提取一個(gè)格式化的數(shù)據(jù)	sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name);	// 按照格式化的形式打印的	printf("%d %lf %s/n", tmp.n, tmp.d, tmp.name); // 100 3.140000 zhangsan		return 0;}
由此可見(jiàn) sscanf 的作用是:
從字符串中讀取一個(gè)格式化的數(shù)據(jù)(把一個(gè)字符串轉(zhuǎn)換成一個(gè)格式化的數(shù)據(jù))


優(yōu)化通訊錄程序

文件的版本:

【Contact】結(jié)構(gòu)體+動(dòng)態(tài)內(nèi)存管理+文件存儲(chǔ)實(shí)現(xiàn)簡(jiǎn)易通訊錄代碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/121411.html

相關(guān)文章

  • 怒肝1.5萬(wàn)字——史上最全C語(yǔ)言文件操作詳解

    摘要:二什么是文件磁盤上的文件就是文件。文件指針變量定義是一個(gè)指向類型數(shù)據(jù)的指針變量。表示向何種流中輸出,可以是標(biāo)準(zhǔn)輸出流,也可以是文件流。文件結(jié)構(gòu)體指針,將要讀取的文件流。 ...

    Alfred 評(píng)論0 收藏0
  • ??學(xué)懂C語(yǔ)言文件操作讀這篇就夠了(萬(wàn)字總結(jié),附習(xí)題)??

    目錄 ??? 一,寫在前面 二,為什么使用文件 1,原因 2,數(shù)據(jù)流 3,緩沖區(qū)(Buffer) 4,C語(yǔ)言中帶緩沖區(qū)的文件處理 5,文件類型 6,文件存取方式 三,什么是文件 1,程序文件 ?2,數(shù)據(jù)文件 3,文件名 四,文件的打開(kāi)和關(guān)閉? 1,文件指針 ?2,文件的打開(kāi)和關(guān)閉 五,文件的順序讀寫 1,功能 2,代碼實(shí)現(xiàn) 六,文件的隨機(jī)讀寫 1,fseek 2,ftell 3,rewind 七,...

    Genng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<