日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C語(yǔ)言 認(rèn)識(shí)轉(zhuǎn)換符 fscanf()用法

 gxr003 2017-08-18

1 原型

int    fscanf(FILE *stream,  const  char* format, …)

功能:    從stream流中連續(xù)讀取能夠匹配format格式的字符到參數(shù)列表中對(duì)應(yīng)的變量里。

參數(shù):    “stream”是FILE指針類型變量,它指向一個(gè)真實(shí)的流對(duì)象。

“format”是C字符串,由“空格”、“非空格”及“轉(zhuǎn)換符”組成。具體格式為%[*][width][modifiers]type。見(jiàn)2.1與format參數(shù)相關(guān)的概念

“…”是與“format”中“轉(zhuǎn)換符”對(duì)應(yīng)變量地址的列表,兩地址間用逗號(hào)隔開(kāi)。

返回值:成功時(shí)返回從流中讀取成功的數(shù)據(jù)的個(gè)數(shù)。失敗時(shí)返回-1(Debian Linux)。

頭文件


2 使用fscanf()

2.1與format參數(shù)相關(guān)的概念

fscanf()的format參數(shù)允許的格式為:“%[*][width][modifiers]type”。[]中的內(nèi)容根據(jù)需要供選,可缺省,%type必須要有,不可省。


%:是format參數(shù)的起始符號(hào),不可缺少。


%[modifiers]type:表一種類型轉(zhuǎn)換符,如%hd表示short int類型轉(zhuǎn)換符。它是format的核心。轉(zhuǎn)換符的作用是將“數(shù)據(jù)”轉(zhuǎn)換為轉(zhuǎn)換符代表的數(shù)據(jù)類型,這里提到的數(shù)據(jù)必須能夠轉(zhuǎn)換為轉(zhuǎn)換符代表的數(shù)據(jù)類型,fscanf讀取數(shù)據(jù)時(shí)也只匹配這樣的數(shù)據(jù)。如pF指向一文件,其中只包含數(shù)據(jù)[123 [空格] 456],用“fscanf(pF, “%d”, &m);”語(yǔ)句是將123這個(gè)數(shù)據(jù)轉(zhuǎn)換為轉(zhuǎn)換符”%d”所代表的數(shù)據(jù)類型即整型后保存到&m地址中去。


%*[modifiers]type: 表示跳過(guò)stream流中能夠被轉(zhuǎn)換為[modifiers]type所代表數(shù)據(jù)類型的數(shù)據(jù)不讀,如在以上的文件中,用“fscanf(pF, “%*d%d”, &m);”就可以跳過(guò)對(duì)123的讀取,而將456轉(zhuǎn)換為整型后保存到&m地址中。%*m[modifiers]type表跳過(guò)stream流中能夠被轉(zhuǎn)換為[modifiers]type所代表數(shù)據(jù)類型的m個(gè)“字符”不讀。如“fscanf(pF,“%*1d%d”, &m);”是將23轉(zhuǎn)換為整型后保存到&m地址中去。


%width[modifiers]type:表示從stream流中讀取width長(zhǎng)度的“字符”來(lái)轉(zhuǎn)換為[modifiers]type對(duì)應(yīng)數(shù)據(jù)類型的數(shù)據(jù)。如“fscanf(pF, “%1d”, &m);”是將1轉(zhuǎn)換為整型后保存到&m地址中去。

2.2 fscanf()例子

fscanf()可以用于讀取文件流中的數(shù)據(jù)。現(xiàn)設(shè)有一個(gè)文件內(nèi)容如下,


Figure1:ffReadFile.dat文件

擁有3個(gè)數(shù)字行的最后一個(gè)數(shù)字決定擁有兩個(gè)數(shù)字的行數(shù)。用fscanf()函數(shù)讀取其內(nèi)的內(nèi)容以筆記到fscanf()函數(shù)的用法。


2.2.1 fscanf()對(duì)空格的處理

用fopen成功打開(kāi)ffReadFile.dat文件后,單用以下語(yǔ)句讀取文件的第一行內(nèi)容:

re = fscanf(pF, '%d%d%d', &oLine.p, &oLine.l, &oLine.x);if( 3 == re){ //Print on stdout printf('%d\t%d\t%d\n', oLine.p, oLine.l, oLine.x);}

此時(shí),可以正確的打印第一行內(nèi)容到屏幕之上。fscanf()函數(shù)讀取第一行三個(gè)數(shù)據(jù)的過(guò)程如下:



Figure2:fscanf()函數(shù)讀取數(shù)據(jù)過(guò)程

文件指針最開(kāi)始指向ffReadFile.dat的第一個(gè)字符(即1)處,然后fscanf()根據(jù)“format”中的第一個(gè)“轉(zhuǎn)換符”讀取文件中的內(nèi)容直到不符合當(dāng)前“轉(zhuǎn)換符”能夠轉(zhuǎn)換的字符為止,如果不符合“轉(zhuǎn)換符”的數(shù)據(jù)為空格或者tab則舍掉空格或者tab使文件指針指向下一個(gè)數(shù)據(jù)。然后fscanf()繼續(xù)在文件中匹配下一個(gè)“轉(zhuǎn)換符”的數(shù)據(jù)。直到為所有的“轉(zhuǎn)換符”匹配完數(shù)據(jù)為止。


2.2.2 fscanf()對(duì)不符合“特定格式”數(shù)據(jù)的處理

當(dāng)不符合“特定格式”所要求的數(shù)據(jù)且不為空格和tab時(shí),fscanf()將匹配到符合“特定格式”的數(shù)據(jù)賦給地址后不再往下讀。如現(xiàn)將ffReadFile.dat中的內(nèi)容修改如下:


Figure3:ffReadFile.dat修改

再用以下代碼讀取第一行數(shù)據(jù),

re = fscanf(pF, '%d%d%d', &oLine.p, &oLine.l, &oLine.x);if( 3 == re){ //Print on stdout printf('%d\t%d\t%d\n', oLine.p, oLine.l, oLine.x);}else{ switch(re){ case 1: printf('oLine.p: %d\n', oLine.p); break; case 2: printf('oLine.p: %d, oLine.l: %d\n', oLine.p, oLine.l); break; default: printf('fscanf() read TypeLine error,re: %d\n', re); break;}
re的值將是1,從而輸出讀取成功的oLine.p的值。對(duì)于此時(shí)的情況,只為&oLine.p成功獲取了數(shù)據(jù),另外兩個(gè)地址的數(shù)據(jù)都獲取失敗。


2.2.3 fscanf()“跳讀符:*”

使用‘*’可以跳過(guò)文件中的部分內(nèi)容,比如還是圖2中的內(nèi)容,利用以下的語(yǔ)句替換上個(gè)程序的fscanf()語(yǔ)句來(lái)讀取第一行數(shù)據(jù):

re = fscanf(pF, '%d%*3c%d%d', &oLine.p, &oLine.l, &oLine.x);

那么程序的輸出結(jié)果為:100       3       2

%*3c表示跳過(guò)3個(gè)字符內(nèi)容。結(jié)合2.1程序就得到了如期的輸出結(jié)果。


2.2.4 fscanf()與輸入模式相同的讀取

如果ffReadFile.dat文件中的內(nèi)容如下,


Figure4:ffReadFile.dat

那么如果要讀取文件中的第一行內(nèi)容,書(shū)寫(xiě)以下語(yǔ)句即可:

fscanf(pF, '%d,%d,%d', &oLine.p, &oLine.l, &oLine.x);
以上提到的逗號(hào)甚至可以換成’a’這樣的字符,但不可以為字符串(Debian Linux 下驗(yàn)證)。


2.2.5 fscanf()讀取指定長(zhǎng)度的數(shù)據(jù)

針對(duì)上圖的文件,可以使用以下語(yǔ)句

fscanf(pF, '%3d,%d,%d', &oLine.p, &oLine.l, &oLine.x);
為&oLine.p讀取只有3位長(zhǎng)的數(shù)據(jù),但因?yàn)榇藭r(shí)文件指針指向10000中最后的那個(gè)0使文件中內(nèi)容與fscanf()“format”不再匹配,后兩個(gè)地址不能夠正確的獲取數(shù)據(jù)。


2.2.6 fscanf()的“format”中的[modifiers]type

以上各個(gè)小例子已經(jīng)筆記了fscanf的一些特性,它讀數(shù)據(jù)成功與否是看文件中的數(shù)據(jù)是否與format的轉(zhuǎn)換符相匹配。type就是C語(yǔ)言中的c(字符轉(zhuǎn)換符), d(整型轉(zhuǎn)換符符), e、E、f、g、 G(浮點(diǎn)型轉(zhuǎn)換符), o(八進(jìn)制類型轉(zhuǎn)換符), s(字符串類型轉(zhuǎn)換符), u(無(wú)符號(hào)整型轉(zhuǎn)換符), x、X(16進(jìn)制數(shù)轉(zhuǎn)換符)轉(zhuǎn)換符。個(gè)人對(duì)轉(zhuǎn)換符的理解是這樣的:將內(nèi)存中的二進(jìn)制轉(zhuǎn)換為某種類型,如%d是將存儲(chǔ)到內(nèi)存中的一段二進(jìn)制轉(zhuǎn)換為整型數(shù)據(jù)。


modifiers是用來(lái)為某些數(shù)據(jù)提供進(jìn)一步類型轉(zhuǎn)換用的,比如%d表示將匹配到的數(shù)據(jù)轉(zhuǎn)換為整型。但在C語(yǔ)言的數(shù)據(jù)類型中還分整型和短整(short int),如果想要將讀取到的數(shù)據(jù)轉(zhuǎn)換為短整型就需要使用modifiers(‘h’)來(lái)進(jìn)一步表示將匹配到的數(shù)據(jù)轉(zhuǎn)換為短整型。同理,對(duì)于其它可以有進(jìn)一步分類的數(shù)據(jù)類型也一樣,modifiers提供相應(yīng)的符號(hào)來(lái)供數(shù)據(jù)的進(jìn)一步轉(zhuǎn)換。Modifiers符號(hào)有:

  • h,加在d, i, n整數(shù)類型轉(zhuǎn)換符前面,整體表示short  int類型轉(zhuǎn)換符。加在o, u,x整型轉(zhuǎn)換符前,整體表示unsigned short  int類型轉(zhuǎn)換符。
  • l,加在d, I, n整數(shù)類型轉(zhuǎn)換符前,整體表示long int類型轉(zhuǎn)換符。加在o, u, x整型類型轉(zhuǎn)換符前,整體表示unsigned  long int類型轉(zhuǎn)換符。加在e, f,g浮點(diǎn)數(shù)轉(zhuǎn)換符前,整體表示double類型轉(zhuǎn)換符。
  • L,加在e, f, g浮點(diǎn)數(shù)類型轉(zhuǎn)換符前,整體表示long double類型轉(zhuǎn)換符。

3 使用fscanf()注意的地方

確保檢查返回值,以確定找到了期待的值。而使用%s 格式的時(shí)候,一定要小心緩沖區(qū)溢出。


CNote Over.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多