国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

這篇具有很好參考價(jià)值的文章主要介紹了【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1. 為什么使用文件

2. 什么是文件?

2.1 程序文件

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

2.3 文件名

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

3.1 文件指針1??

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

??相對(duì)路徑

??絕對(duì)路徑

4. 文件的順序讀寫

1.fputc寫文件--字符輸出函數(shù)

2.fgetc(pf)讀文件--字符輸入函數(shù)

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

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

5.fprintf--針對(duì)所有輸出流(文件流/stdout)的格式化輸出函數(shù)

6.fscanf --?針對(duì)所有輸入流(文件流/stdin)的格式化輸入函數(shù)

????????為什么需要用到"流"?

????????stdin和stdout的適用情況?

????????1.fgetc測(cè)試:

????????2.fputc測(cè)試:

????????3.fprintf測(cè)試:

????????4.fscanf測(cè)試:

7.sscanf和sprintf


前言:

這篇文章是關(guān)于文件是什么、文件的操作、文件的讀寫函數(shù):fputc、fgetc、fputs、fgets、fprintf、

fscanf、sscanf和sprintf。以及流的概念,與為什么要使用到流,以及stdin和stdout的適用情況的知

識(shí)點(diǎn)總結(jié),如有錯(cuò)誤歡迎大佬指正,感謝您的支持!

1. 為什么使用文件

我們前面學(xué)習(xí)結(jié)構(gòu)體時(shí),寫了通訊錄的程序,當(dāng)通訊錄運(yùn)行起來的時(shí)候,可以給通訊錄中增加、刪除數(shù)據(jù),此時(shí)數(shù)據(jù)是存放在內(nèi)存中,當(dāng)程序退出的時(shí)候,通訊錄中的數(shù)據(jù)自然就不存在了,等下次運(yùn)行通訊錄程序的時(shí)候,數(shù)據(jù)又得重新錄入,如果使用這樣的通訊錄就很難受。
我們?cè)谙爰热皇峭ㄓ嶄浘蛻?yīng)該把信息記錄下來,只有我們自己選擇刪除數(shù)據(jù)的時(shí)候,數(shù)據(jù)才不復(fù)存在。
這就涉及到了數(shù)據(jù)持久化的問題,我們一般數(shù)據(jù)持久化的方法有,把數(shù)據(jù)存放在磁盤文件、存放到數(shù)據(jù)庫等方式。 使用文件我們可以將數(shù)據(jù)直接存放在電腦的硬盤上,做到了數(shù)據(jù)的持久化。

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)容的文件。
區(qū)別:
【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))
程序的數(shù)據(jù)都是在內(nèi)存里面放的,通過printf把數(shù)據(jù)顯示到屏幕上去叫做輸出操作,從鍵盤上讀取數(shù)據(jù)之后,最終放到程序的內(nèi)存里面去,其實(shí)是通過scanf函數(shù)的輸入操作
【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))
能不能把數(shù)據(jù)從內(nèi)存放到文件里面去呢? 請(qǐng)看以下圖解以及2.3
【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

2.3 文件名

一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),以便用戶識(shí)別和引用。
文件名包含3 部分:文件路徑 +文件名主干+文件后綴
例如: c:\code\test.txt? -->意思是:
c:\code\ 是文件路徑,放在c盤底下的code文件夾底下的
test,是文件名主干 .txt是文件后綴
為了方便起見,文件標(biāo)識(shí)常被稱為文件名 。
那c語言是如何來操作文件呢?

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

假設(shè)我要從冰箱里面拿冰棍-->打開冰箱,拿冰棍,關(guān)上冰箱

類比.-->如果想給文件存放數(shù)據(jù),或者從文件里面拿數(shù)據(jù):打開文件-->寫或讀數(shù)據(jù)(使用)-->關(guān)閉文件

最核心的是要知道文件如何打開和關(guān)閉:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

3.1 文件指針1??

緩沖文件系統(tǒng)中,關(guān)鍵的概念是 文件類型指針 ,簡(jiǎn)稱 文件指針 。
每個(gè)被使用的文件都在內(nèi)存中開辟了一個(gè)相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名 FILE.
這段話什么意思呢?
當(dāng)我們要操作一個(gè)文件,名為data.txt,要操作這個(gè)文件首先就要打開它,這個(gè)文件就正在被使用,而被使用的時(shí)候,這個(gè)文件就會(huì)在內(nèi)存中維護(hù)一個(gè) 文件信息區(qū)(可以理解為一個(gè)結(jié)構(gòu)體的變量)?
這個(gè)文件信息區(qū)跟文件(.txt)是關(guān)聯(lián)的,是為了描述這個(gè)文件的, 文件信息區(qū) 里面放了( 文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)
那它是如何存放到內(nèi)存里面的?
創(chuàng)建了一個(gè)File結(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;//FILE-->本質(zhì)是一個(gè)結(jié)構(gòu)體類型

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

意思是:(操作系統(tǒng)不同不同的c編譯器對(duì)于FILE結(jié)構(gòu)體是怎么定義的是不相同的,windows對(duì)于文件的使用習(xí)慣、操作、文件后綴等等,跟linux、macos是不一樣的,是由不同的研發(fā)團(tuán)隊(duì)、不同公司去開發(fā)的,所以在對(duì)FILE這個(gè)結(jié)構(gòu)的定義都是有差異的

每當(dāng)打開一個(gè)文件的時(shí)候,系統(tǒng)會(huì)根據(jù)文件的情況自動(dòng)創(chuàng)建一個(gè) FILE 結(jié)構(gòu)的變量(跟data.txt文件相關(guān)的文件信息區(qū)),并填充其中的信息, 使用者不必關(guān)心細(xì)節(jié)。?
意思是: 這個(gè)變量就是對(duì)這個(gè)信息區(qū)的整合 ?信息區(qū)就是詳細(xì)的解釋
如何維護(hù)文件信息區(qū)( 也就是結(jié)構(gòu)體變量)?
一般都是通過 一個(gè)FILE的指針 來維護(hù)這個(gè) FILE 結(jié)構(gòu)的變量,這樣使用起來更加方便
FILE * pf ; // 文件指針變量
圖解:
【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))
定義 pf 是一個(gè)指向 FILE 類型數(shù)據(jù)的指針變量??梢允?/span> pf 指向某個(gè)文件的文件信息區(qū)(是一個(gè)結(jié)構(gòu)體變量)。通過該文件信息區(qū)中的信息就能夠訪問該文件。也就是說, 通過文件指針變量能夠找到與它關(guān)聯(lián)的文件
比如:
【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

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

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

在編寫程序的時(shí)候,在打開文件的同時(shí),都會(huì)返回一個(gè) FILE*的指針變量指向該文件 ,也相當(dāng)于建立了指針和文件的關(guān)系。
ANSIC 規(guī)定使用 fopen 函數(shù)來打開文件 fclose來關(guān)閉文件
參數(shù)問題:
【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))
FILE* pf = fopen("test.txt","w");// pf(指針)可以通過地址找到這個(gè)文件對(duì)應(yīng)的文件信息區(qū),就可以操作這個(gè)文件
以下是fopen的打開方式:
這里我要說一下這個(gè)打開方式的意思:例如以讀的方式打開,就是說,根據(jù)拿到的這個(gè)文件指針, 只有讀的權(quán)限,沒有寫的權(quán)限一般是和下面文件的輸入輸出函數(shù)是相對(duì)應(yī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è)新的文件

實(shí)例代碼:

#include<stdio.h>
int main()
{
	//打開文件
	//相對(duì)路徑
	FILE* pf = fopen("test.txt","w");//當(dāng)打開test.txt,會(huì)在內(nèi)存中創(chuàng)建一個(gè)文件信息區(qū),
	                                 //這時(shí)是把文件信息區(qū)的地址放到pf里面去了,
	if (pf == NULL)                  //pf可以通過地址找到這個(gè)文件對(duì)應(yīng)的文件信息區(qū),就可以操作這個(gè)文件
	{
		perror("fopen");
		return 1;
	}						         
	//寫文件

	//關(guān)閉文件
	fclose(pf);//不會(huì)把pf置為空指針,可以想象成一個(gè)變量,以值傳遞的形式,所以不能改掉pf
    pf = NULL;

	return 0;
}

有兩個(gè)該注意的點(diǎn):

經(jīng)過執(zhí)行之后:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

??相對(duì)路徑

這個(gè)test.txt會(huì)新建出來,但是里面是沒有內(nèi)容的

fopen("test.txt","w")-->指定的名字test.txt,而且是在這個(gè)工程底下去搞得

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?打開看看:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?但是這個(gè)時(shí)候如果寫入東西:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

再執(zhí)行:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?里面的內(nèi)容就銷毀掉了:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?這時(shí)候換成fopen("test.txt", "r")看看

?#include<stdio.h>

int main()
{
?? ?//打開文件
?? ?//相對(duì)路徑
?? ?FILE* pf = fopen("test.txt", "r");//這個(gè)位置換成"r"
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ?if (pf == NULL)? ? ? ? ? ? ? ? ?
?? ?{
?? ??? ?perror("fopen");
?? ??? ?return 1;
?? ?}
?? ?//寫文件

?? ?//關(guān)閉文件
?? ?fclose(pf);//不會(huì)把pf置為空指針,可以想象成一個(gè)變量,以值傳遞的形式,所以不能改掉pf
?? ?pf = NULL;

?? ?return 0;
}

返回值問題:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

返回成功/失敗

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?絕對(duì)路徑

如果在這個(gè)桌面上創(chuàng)建一個(gè)文件

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

右擊屬性找到路徑:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

實(shí)例代碼:

#include<stdio.h>
int main()
{
	//打開文件
	//相對(duì)路徑 
	FILE* pf = fopen("C:\\Users\\zzc\\Desktop\\test.txt", "w");			
	if (pf == NULL)                  
	{
		perror("fopen");
		return 1;
	}
	//寫文件

	//關(guān)閉文件
	fclose(pf);//不會(huì)把pf置為空指針,可以想象成一個(gè)變量,以值傳遞的形式,所以不能改掉pf
	pf = NULL;

	return 0;
}

留意一下:加多幾條'\'的原因是把原來的'\'也轉(zhuǎn)義了,因?yàn)橹虚g有個(gè)'\t'

這個(gè)位置:"C:\Users\zzc\Desktop\test.txt"

說明一下:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?如果原來的.txt里面有內(nèi)容,經(jīng)過執(zhí)行以后:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?會(huì)把原來的內(nèi)容徹底銷毀掉

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

4. 文件的順序讀寫

這些函數(shù)的意義:一般與上面fopen的打開方式是相對(duì)應(yīng)的,以什么打開方式就賦予了這個(gè)pf指針什么樣的權(quán)限

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

1.fputc寫文件--字符輸出函數(shù)

?fputc('a' + i,pf);//此函數(shù)一次寫一個(gè)字符,所以需要一個(gè)循環(huán)來輸出26個(gè)字符

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

文獻(xiàn):?

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

翻譯:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))?代碼實(shí)例:

//fputc 寫文件
#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//寫文件
	int ch = 0;
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		fputc('a' + i,pf);//此函數(shù)一次寫一個(gè)字符,ascll碼值+1
	}
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
	return 0;
}

效果:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

2.fgetc(pf)讀文件--字符輸入函數(shù)

ch = fgetc(pf);//此函數(shù)一次讀取一個(gè)字符

可以看以下執(zhí)行效果:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

文獻(xiàn):

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

翻譯:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))?代碼實(shí)例:

//fgetc - 讀文件操作
#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1; 
	}
	//讀文件
	//把26個(gè)字面寫到文件中
	int ch=0;//看上面的文獻(xiàn),所以為什么這個(gè)地方會(huì)用int接收
	//printf("%c\n", ch);
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		ch = fgetc(pf);//此函數(shù)一次讀取一個(gè)字符
		printf("%c ",ch);//ascll碼值+1
	}
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代碼執(zhí)行:注意前提是這個(gè)文件里面有內(nèi)容,否則不會(huì)輸出任何東西

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?執(zhí)行:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

為什么pf不能++

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))如果加入一行代碼:pf++?

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?原因:對(duì)于文件指針進(jìn)行++操作是不允許的,語法不支持

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

文獻(xiàn):

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?翻譯:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

代碼實(shí)現(xiàn):?

//fputs 寫一行數(shù)據(jù)
#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");//這里寫文件名的話默認(rèn)是在這個(gè)工程底下搞的,寫成絕對(duì)路徑或者其它相對(duì)路徑,要指定
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//寫一行數(shù)組 hello bit
	fputs("hello bit\n", pf);
	fputs("hello world\n", pf);

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

}

輸出不換行:

fputs("hello bit", pf);
fputs("hello world\n", pf);

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

輸出換行: 上面的代碼可參考

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

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

文獻(xiàn):

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

翻譯:?

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?代碼實(shí)例:以下注釋說明了為什么打印hell

//fgets - 讀一行數(shù)據(jù)
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//讀
	char arr[20];
	fgets(arr,5, pf);//在.txt文件有內(nèi)容的情況下,這里的參數(shù)5說明最多讀4個(gè),最后一個(gè)位置是留給'\0'的
	printf("%s\n", arr);
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
	return 0;
}

執(zhí)行:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

5.fprintf--針對(duì)所有輸出流(文件流/stdout)的格式化輸出函數(shù)

以下可以看到fprintf只是比printf多了一個(gè)流指針的參數(shù)而已。
【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

?與printf的區(qū)別:printf是針對(duì)標(biāo)準(zhǔn)輸出流 (stdout) 的格式化的輸出函數(shù)

假設(shè)要把struct S s = { 100,3.14f,"zhangsan" };信息打印出來那應(yīng)該怎么寫呢?

那就應(yīng)該先寫成printf("%d %f %s\n", s.n, s.f, s.arr);,然后在前面加個(gè)參數(shù)改成fprintf(pf,"%d %f %s\n", s.n, s.f, s.arr)即可

#include<stdio.h>
struct S
{
	int n;
	float f;
	char arr[20];
};
int main()
{
	struct S s = { 100,3.14f,"zhangsan" };
	//打開文件
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//寫文件
	fprintf(pf, "%d %f %s\n", s.n, s.f, s.arr);

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

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

6.fscanf --?針對(duì)所有輸入流(文件流/stdin)的格式化輸入函數(shù)

跟fprintf傳的文件流指針是一樣的

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

與scanf的區(qū)別:是針對(duì)標(biāo)準(zhǔn)輸入流 (stdin)的格式化的輸入函數(shù)

#include<stdio.h>
struct S
{
	int n;
	float f;
	char arr[20];
};
int main()
{
	struct S s = { 100,3.14f,"zhangsan" };
	//打開文件
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//寫文件
	fscanf(pf, "%d %f %s",&(s.n),&(s.f),s.arr);//數(shù)組名arr是首元素地址,所以不需要取地址操作符
	printf("%d %f %s\n", s.n, s.f, s.arr);
	//關(guān)閉文件
	fclose(pf);
	pf = NULL;
	return 0;
}

執(zhí)行:?

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

為什么需要用到"流"?

前提:如何把數(shù)據(jù)寫進(jìn)入外部設(shè)備,需要對(duì)每一種外部設(shè)備的操作比較多的了解,例如數(shù)據(jù)是怎么寫進(jìn)入文件、屏幕、網(wǎng)絡(luò)、打印機(jī)等外部設(shè)備,都得知道它們的實(shí)現(xiàn)細(xì)節(jié)(讀和寫的細(xì)節(jié)),對(duì)于程序員來說太難了。

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

流的概念:?這時(shí)候抽象化了一個(gè)概念“流”,"流"知道怎么把數(shù)據(jù)寫進(jìn)各種外部設(shè)備的細(xì)節(jié),那對(duì)于程序員而言,要讀取數(shù)據(jù)就從流里面讀,要寫數(shù)據(jù)就寫到流里面就可以了,至于這個(gè)流怎么跟外部設(shè)備交互的是不需要關(guān)心的。

流的種類:

stdin標(biāo)準(zhǔn)輸入流 stdou標(biāo)準(zhǔn)輸出流?stderr標(biāo)準(zhǔn)錯(cuò)誤流都是FILE*的指針

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

stdin和stdout的適用情況?

回到前面的輸入輸出函數(shù):

fgetc、fgets、fscanf均適用于文件流以及標(biāo)準(zhǔn)輸入流 -- stdin

fputc、fputs、fprintf均適用于文件流以及標(biāo)準(zhǔn)輸出流 -- stdout?

1.fgetc測(cè)試:

#include<stdio.h>
int main()
{
	int ch = fgetc(stdin);//輸入
	printf("%c\n", ch);
    return 0;
}

?執(zhí)行:以下是輸入一個(gè)字符和輸出的情況

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

2.fputc測(cè)試:

int main()
{
	fputc('a', stdout);//輸出
	fputc('f', stdout);
	fputc('g', stdout);
	fputc('z', stdout);
    return 0;
}

?執(zhí)行:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

3.fprintf測(cè)試:

int main()
{
	struct S s = { 1000,3.666f,"hehe" };
	fprintf(stdout,"%d %f %s\n",s.n,s.f,s.arr);
    return 0;
}

執(zhí)行:?

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

4.fscanf測(cè)試:

int main()
{
	struct S s = { 0 };
	fscanf(stdin, "%d %f %s",&(s.n),&(s.f),s.arr);
	fprintf(stdout, "%d %f %s\n", s.n, s.f, s.arr);
}

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

7.sscanf和sprintf

sscanf文獻(xiàn)

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

翻譯:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))?sprintf文獻(xiàn)

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

翻譯:

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))?

sscanf--把字符串轉(zhuǎn)換成格式化的數(shù)據(jù)

sprintf--把格式化的數(shù)據(jù)轉(zhuǎn)換成字符串

struct S
{
	int n;
	float f;
	char arr[20];
};
int main()
{
	//序列化和反序列化

	struct S s = { 200,3.5f,"wangwu" };
	//把一個(gè)結(jié)構(gòu)體轉(zhuǎn)換成字符串
	char arr[200] = { 0 };
	sprintf(arr, "%d %f %s\n", s.n, s.f, arr);
	printf("字符串的數(shù)據(jù): %s\n", arr);

	//把一個(gè)字符串轉(zhuǎn)換成對(duì)應(yīng)的格式化數(shù)據(jù)
	struct S tmp = { 0 };
	sscanf(arr, "%d %f %s", &(tmp).n, &(tmp.f), &tmp.arr);
	printf("格式化的數(shù)據(jù):%d %f %s\n", tmp.n, tmp.f, tmp.arr);
	return 0;
}

執(zhí)行:?

【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))

關(guān)于文件操作的知識(shí)還有下半篇,歡迎大佬指正,感謝支持!文章來源地址http://www.zghlxwxcb.cn/news/detail-487781.html

到了這里,關(guān)于【C進(jìn)階】文件操作(上)--(詳解、非常適合基礎(chǔ)入門學(xué)習(xí))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ue4/5藍(lán)圖與c++混用基礎(chǔ)入門的基礎(chǔ)操作(適合有藍(lán)圖基礎(chǔ)和c++基礎(chǔ)的新手,創(chuàng)建自己的藍(lán)圖)

    ue4/5藍(lán)圖與c++混用基礎(chǔ)入門的基礎(chǔ)操作(適合有藍(lán)圖基礎(chǔ)和c++基礎(chǔ)的新手,創(chuàng)建自己的藍(lán)圖)

    ? ? ? ? 首先是最開始的創(chuàng)建項(xiàng)目,用c++模式進(jìn)行創(chuàng)建。 ? ? ? ? ue4: ? ? ? ? ue5: ?創(chuàng)建之后,兩個(gè)都會(huì)自動(dòng)為你打開vs,不過ue4.26要的是vs2019,ue5要的是vs2022,有時(shí)候打不開是缺少一些東西,這些東西在csdn里面可以查到,作者就不細(xì)講了。 在ue5(4是一樣的)中,我們可

    2023年04月12日
    瀏覽(83)
  • 黑客零基礎(chǔ)從入門到精通學(xué)習(xí)成長(zhǎng)路線(超多圖、非常詳細(xì)),看完這一篇就夠了

    黑客零基礎(chǔ)從入門到精通學(xué)習(xí)成長(zhǎng)路線(超多圖、非常詳細(xì)),看完這一篇就夠了

    近幾年,隨著移動(dòng)互聯(lián)網(wǎng)、大數(shù)據(jù)、云計(jì)算、人工智能等新一代信息技術(shù)的快速發(fā)展,圍繞網(wǎng)絡(luò)和數(shù)據(jù)的服務(wù)與應(yīng)用呈現(xiàn)爆發(fā)式增長(zhǎng),豐富的應(yīng)用場(chǎng)景下暴露出越來越多的網(wǎng)絡(luò)安全風(fēng)險(xiǎn)和問題。 但是,我國網(wǎng)絡(luò)安全整體投入不高。網(wǎng)絡(luò)安全建設(shè)方面,國內(nèi)網(wǎng)絡(luò)安全投入占信息

    2024年02月07日
    瀏覽(17)
  • [C語言進(jìn)階詳解]文件操作(上)

    [C語言進(jìn)階詳解]文件操作(上)

    CSDN的各位友友們你們好,今天千澤為大家?guī)淼氖?C語言詳解-文件操作篇, 接下來讓我們一起了解一下JAVA的學(xué)習(xí)路線吧! 如果對(duì)您有幫助的話希望能夠得到您的支持和關(guān)注,我會(huì)持續(xù)更新的! 一.文件的概念 計(jì)算機(jī)文件,是存儲(chǔ)在某種長(zhǎng)期儲(chǔ)存設(shè)備或臨時(shí)存儲(chǔ)設(shè)備中的一段數(shù)據(jù)流

    2023年04月16日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】C--順序表1.0版本(本文非常適合小白觀看,已盡力詳解,以及圖解也是盡量列舉)

    【數(shù)據(jù)結(jié)構(gòu)】C--順序表1.0版本(本文非常適合小白觀看,已盡力詳解,以及圖解也是盡量列舉)

    目錄 0.前言 什么是數(shù)據(jù)結(jié)構(gòu)? 1.邏輯結(jié)構(gòu): 1.1線性結(jié)構(gòu): 1.2非線性結(jié)構(gòu): ????????(1)集合 ????????(2)樹形結(jié)構(gòu) ????????(3)圖形結(jié)構(gòu)或者網(wǎng)狀結(jié)構(gòu) 2.存儲(chǔ)結(jié)構(gòu) 一.線性表 二.順序表 順序表與數(shù)組的關(guān)系:(非常容易混淆) 1.靜態(tài)順序表:使用定長(zhǎng)數(shù)組存儲(chǔ)元素 2.動(dòng)態(tài)順序表

    2024年02月06日
    瀏覽(41)
  • 適合進(jìn)階學(xué)習(xí)的 機(jī)器學(xué)習(xí) 開源項(xiàng)目(可快速下載)

    適合進(jìn)階學(xué)習(xí)的 機(jī)器學(xué)習(xí) 開源項(xiàng)目(可快速下載)

    AI時(shí)代已經(jīng)來臨,機(jī)器學(xué)習(xí)成為了當(dāng)今的熱潮。但是,很多人在面對(duì)機(jī)器學(xué)習(xí)時(shí)卻不知道如何開始學(xué)習(xí)。 今天,我為大家推薦幾個(gè)適合初學(xué)者的機(jī)器學(xué)習(xí)開源項(xiàng)目,幫助大家更好地了解和掌握機(jī)器學(xué)習(xí)的知識(shí)。這些項(xiàng)目都是開源的,且已經(jīng)加入了 Github加速計(jì)劃 ,可以 快速下

    2024年01月19日
    瀏覽(24)
  • 第五十八天學(xué)習(xí)記錄:C語言進(jìn)階:文件操作1

    第五十八天學(xué)習(xí)記錄:C語言進(jìn)階:文件操作1

    在程序設(shè)計(jì)中,一般有兩種文件:程序文件、數(shù)據(jù)文件 程序文件 包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。 數(shù)據(jù)文件 文件的內(nèi)容不一定是程序,而是程序運(yùn)行時(shí)讀寫的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件

    2024年02月07日
    瀏覽(22)
  • 網(wǎng)絡(luò)安全進(jìn)階學(xué)習(xí)第二十課——CTF之文件操作與隱寫

    網(wǎng)絡(luò)安全進(jìn)階學(xué)習(xí)第二十課——CTF之文件操作與隱寫

    ------ 當(dāng)文件沒有文件擴(kuò)展名,或者具有文件擴(kuò)展名但無法正常打開時(shí),可以根據(jù)識(shí)別到的文件類型進(jìn)行修改文件擴(kuò)展名,從而使文件能夠正常打開。 使用場(chǎng)景:不知道后綴名,無法打開文件。 格式: file myheart 這里就識(shí)別到是一個(gè)PCAP的流量包 ------ 通過WinHex程序可以查看文件

    2024年02月07日
    瀏覽(31)
  • Python超詳細(xì)基礎(chǔ)文件操作(詳解版)

    Python超詳細(xì)基礎(chǔ)文件操作(詳解版)

    1. 文件打開與關(guān)閉 1.1 打開文件 在Python中,你可以使用 open() 函數(shù)來打開文件。 以下是一個(gè)簡(jiǎn)單的例子: 在上述示例中: \\\'example.txt\\\' 是文件的路徑和名稱,你可以根據(jù)實(shí)際情況修改為你想要打開的文件。 \\\'r\\\' 表示只讀模式。如果你想要寫入文件,可以使用 \\\'w\\\' 模式,如果想要

    2024年01月17日
    瀏覽(24)
  • 網(wǎng)絡(luò)安全入門教程(非常詳細(xì))從零基礎(chǔ)入門到精通!

    網(wǎng)絡(luò)安全入門教程(非常詳細(xì))從零基礎(chǔ)入門到精通!

    網(wǎng)絡(luò)安全是一個(gè)龐大而不斷發(fā)展的領(lǐng)域,它包含多個(gè)專業(yè)領(lǐng)域,如網(wǎng)絡(luò)防御、網(wǎng)絡(luò)攻擊、數(shù)據(jù)加密等。介紹網(wǎng)絡(luò)安全的基本概念、技術(shù)和工具,逐步深入,幫助您成為一名合格的網(wǎng)絡(luò)安全從業(yè)人員。 1.計(jì)算機(jī)基礎(chǔ)知識(shí) 了解了計(jì)算機(jī)的硬件、軟件、操作系統(tǒng)和網(wǎng)絡(luò)結(jié)構(gòu)等基礎(chǔ)知

    2024年04月13日
    瀏覽(26)
  • 網(wǎng)絡(luò)安全入門教程(非常詳細(xì))從零基礎(chǔ)入門到精通

    網(wǎng)絡(luò)安全入門教程(非常詳細(xì))從零基礎(chǔ)入門到精通

    1.入行網(wǎng)絡(luò)安全這是一條堅(jiān)持的道路,三分鐘的熱情可以放棄往下看了。 2.多練多想,不要離開了教程什么都不會(huì)了,最好看完教程自己獨(dú)立完成技術(shù)方面的開發(fā)。 3.有時(shí)多百度,我們往往都遇不到好心的大神,誰會(huì)無聊天天給你做解答。 4.遇到實(shí)在搞不懂的,可以先放放,

    2024年01月18日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包