2014-01-15 24 views
0

我想從文件中選擇浮點數。我認爲作爲一個解決方案是這樣的:從文件中選擇浮點數

while ((ch= getc(fp)) != EOF) 
{ 
    if(isdigit(ch)) 
     //do some stuff 
} 

但是後來我看到,那這種方法我只得到了整數(但我想浮動)。所以,我看着它,我發現這一點:

while((fscanf(fp, "%lf", &n) == 1) 
    //do some stuff 

我也看了fscanf()和中它說其他東西的定義..

返回值

成功時,函數返回成功填充的參數 列表的項目數。由於匹配故障,讀數爲 錯誤或文件結束的範圍,此計數可以匹配預期的 項目數或者更少(甚至爲零)。

如果發生讀取錯誤或文件結束時 讀取,則設置正確的指示符(feof或ferror)。並且,如果在成功讀取任何數據之前發生了 ,則返回EOF。

如果解釋寬字符時發生編碼錯誤,則函數 將errno設置爲EILSEQ。

但是,我不明白while((fscanf(fp, "%lf", &n) == 1)。如果fscanf()讀取一個浮點數將返回1,否則會返回其他的東西?

+0

當你說「選擇」,這是否意味着有更多的非浮點數,你想跳過的文件中的數據? – unwind

+0

當我寫了我認爲如此的問題時,但我更仔細地閱讀了我的練習,然後解決方案,因爲它看起來程序只是選擇數字,然後結果打印爲浮點型。然而,我仍然保持這個問題,因爲我很好奇我該怎麼做(只選擇浮動數字)。 – yaylitzis

回答

2

如果您的代碼中的fscanf調用讀取並轉換一個浮點值,則它將返回1。如果您的格式要求進行兩次轉換(例如,"%lf %d"),則返回2即可獲得成功。總之,它將返回格式字符串中已成功解析的%格式的數量。

如果輸入是而不是浮點數,則fscanf將返回0,因此循環將結束。或者如果出現錯誤或者您已經到達文件末尾,它將返回EOF,這也將打破循環。

+0

我打印了fscanf的結果(在循環過程中,爲1),並且如果我放置了一個字符,它將返回0,並從循環中退出。我試過這個'while((fscanf(fp,「%lf%d」,&n)== 1'),正如你所說的那樣,看看它是否會返回2,但是我得到了一個警告'warning':format'%d'expect a匹配'int *'參數' – yaylitzis

+0

@ Nat95在'fscanf()'中提供了一些變量來保存由'%d'得到的值,就像'%if'有'&n' –

+0

是的,你有權利〜!我它錯了! – yaylitzis