close

這次作業memory 讀取使用紀錄時,因為只要用部分資料,所以查了一下用法

發現原來fscanf 可以選擇要讀什麼跳過什麼

 

這是寫比較詳細的網站,不過他用的是scanf 不過大同小異啦,只是看用什麼輸入

http://hsian-studio.blogspot.tw/2008/09/blog-post_4564.html

 

※ scanf從鍵盤輸入中格式讀取資料

我想scanf()應該大家最常用到的輸入資料的函數了,所以這邊就不多講了,但是它卻具有很特別的妙用,scanf是格式化輸入,所以可以你訂出來的格式,別人套用你的格式來輸入資料。

scanf中空格的意義

使用%s%d%f等等的格式輸入,在讀到目標之前有遇到空白或是TAB或是換行字元,都會自動略過,直遇到整數或是字串或是浮點數,但是如果是用%c的話,那是讀取stdin中第一個字元,那如果是空白列,那可就讀到空白了,因此可改成scanf(" %c")表示要讀取一個字元之前,自動略過前面有空白或是TAB或是換行的字元。

scanf中的略過「*」和集合「[]」

* %*s (跳過讀入一個字串)
* %*d (跳過讀入一個數值)
* %[] (讀取字串,但只讀取包含於集合中的字元)
* %[^] (讀取字串,直讀到包含於集合中出現的字元)
* []的正規表示式,可用「-」來表示從那裡到那裡
* %[a-z]讀取字串中的字元只含a-z的字元,若讀到別的字元或是數字就停止
* %[^0-3]讀取一字串,直讀到遇到0123字元的出現就停止讀取。
* 程式回傳讀入成功的數目

Example:
輸入2007/6/6要取得年月日的話

if (scanf("%d%*[ \n\t/]%d%*[ \n\t/]%d", &a, &b, &c) == 3)
{
printf("year: %d, month: %d, day %d", a, b, c);
}

or

scanf("%d %*c%d %*c%d", &a, &b, &c);

其中%*[ \n\t/]指跳過「空白」「Tab」「換行」「/」這些字元,或是利用scanf中的空白字元,讓讀入自動會跳過空白或TAB或是換行。

由上程式我們可以由自訂的格式輸入來把year, month, day全都讀入,而別人如果沒有造你的格式輸入的話,資料回傳就不會剛剛好等於3,那就是代表資料輸入有錯誤。

Example:
輸入(13, 22, 41)要把數字取出來的話

scanf("%*[ \t\n(]%d%*[ \t\n,]%d%*[ \t\n,]%d%*[ \t\n)]", &a, &b, &c);

仔細的分解一下,就漸漸可以了解這種格式輸入要怎麼活用,如果可以活用的話,那取資料的時候就可以大大減少自己在那邊拆來拆去,拿出自己要的東西了。

arrow
arrow
    全站熱搜

    angledark0123 發表在 痞客邦 留言(0) 人氣()