2010-04-10 99 views
2

如何從C++中的文件中讀取雙精度值?如何從C++中的文件中讀取雙精度值

對於整型我知道你可以使用函數getline(),然後的atoi,但我沒有找到一個數組的雙重功能。有什麼可用於讀取雙打,或將字符數組轉換爲雙精度?

+1

爲什麼不把它作爲char *讀取並使用sscanf? – Cam 2010-04-10 21:43:23

+1

@incrediman:因爲如果您已經在使用標準流,您可能不想處理C函數頭痛問題。 – 2010-04-10 21:54:07

+0

如果你想堅持'getline()'然後'atoi()',你可以用'atof()'代替'atoi()',你應該沒問題。但@R塞繆爾克拉特科的方法應該適用於雙打和整數。 – 2010-04-11 03:35:44

回答

3

您可以使用流提取:

std::ifstream ifs(...); 
double d; 
ifs >> d; 

這項工作提供了其他然後空格,流中的下一個數據應該是在文字表述雙。

提取後,可以檢查流的狀態,看是否存在錯誤:

ifs >> d; 
if (!ifs) 
{ 
    // the double extraction failed 
} 
+2

這是錯誤的。測試流的失敗('.fail()',它與'.good()'相當於'.rdstate()== 0')的微妙差別。使用'if(!(ifs >> d)){/ *失敗* /}'或'ifs >> d;如果(!ifs){/*..*/}'或(通常更有用)'if(ifs >> d){/ * use d * /} else {/ * failed * /}'。 – 2010-04-10 21:47:08

+3

(使用'!stream'與'stream.fail()'相同,使用'bool(stream)'和'!stream.fail()'相同。) – 2010-04-10 21:53:40

+0

@RogerPate - 謝謝。 – 2010-04-11 02:15:06

3

不要考慮使用ATOF(),或任何ATO的..功能,因爲他們做的不允許您診斷錯誤。看看strtodstrtol。或者使用流提取操作符。

+1

downvote的原因是什麼? – 2010-04-10 21:46:46

+0

+1因爲我不知道strtod和strtol – JonM 2010-04-10 21:55:22

+0

-1使用短語「downvote的原因?」。 – sblom 2010-04-10 22:45:34

0

您可以利用istringstream例如,這裏有toDouble和toInt:

double toDouble(string s) { 
    double r = 0; 
    istringstream ss(s); 
    ss >> r; 
    return r; 
} 

int toInt(string s) { 
    int r=0; 
    istringstream ss(s); 
    ss >> r; 
    return r; 
} 
+0

這已經存在於升壓,在一個更好的形式,包括錯誤校驗功能,lexical_cast的。 – 2010-04-10 21:51:55

+0

@Roger Pate:是的,它的確如此。儘管對於不能使用boost的情況,這很有用。 – 2010-04-10 21:56:14

+0

@比利:它比atof更有用,Neil正確地[指出](http://stackoverflow.com/questions/2615078/how-to-read-in-a-double-from-a-file- in-c/2615119#2615119)應該被避免(除非你已經驗證了輸入,但在這裏不是這樣)。 – 2010-04-10 21:59:50

2

我想知道,做一件需要小心區域設置(例如,一個區域可以使用逗號而不是圓點分隔小數部分)還是字符串流總是默認爲一些標準的「C語言環境」符號?