2013-05-20 82 views
-1

我已經有了一些文件,其中有一些雙精度(9是準確的,對於3x3矩陣)用二進制編寫的。我試圖利用它們作爲它們所代表的真正的double值(數字ej:5.66/-1.882/etc ..)。.read()reinterpret_cast <char *> C++

它們一個接一個地放在文件中,沒有任何空格:3.245-2.453.253 ......它們正好是9個數字。

然後,我有一個指針指向的9個插槽(0-8),我想,以填補雙打的價值載體的結構,所以,在這裏就是我試圖至今:

struct input{ 
    double data*; 
    double myvector[9]; 
}; 

然後

input test; 
test.data = test.myvector; 
ifstream f(file,ios::binary); 

f.read(reinterpret_cast<char *>(test.data),sizeof(double)*3*3); 

後來,當我去一些簡單的std ::法院,檢查值我印入控制檯一些奇怪的數字:

-0.1667被打印爲:-1, 57218e + 26

這是否應該發生?如果不是,我做錯了什麼?如果我正確的做了這件事,我需要做些什麼才能獲得我的「-0.1667」?

謝謝。編輯:當他們創建文件時,他們有一個指針(指向像我的例子一樣的雙打矢量),他們只是做了一個f.write(無論你放在這裏);而當我說數字是一個接一個的時候,這就是我的意思,在那裏的任何一箇中間都沒有黑色字符。

編輯2:全碼:

#include <iostream> 
#include <fstream> 

using namespace std; 

struct input{ 
    double data*; 
    double myvector[9]; 
}; 

int main(int argc, char * argv[]){ 

    input test; 
    test.data=test.myvector; 

    ifstream f(argv[1], ios::binay); // argv[1] is the file EJ: ./program myfile 
    f.read(reinterpret_cast <char *> (test.data), sizeof(double)*9); // being 9 values. 

    for(int i=0;i<9;i++){ 

     cout << test.data[i] << endl; 

    } 
return 0; 
} 
+0

你確定該文件是二進制格式嗎? – jrok

+0

程序選擇的字節,而不是通過f.read() – Zasito

+0

@jrok絕對值。他們作爲一個例子來測試f.read()(因爲我還在學習)。 – Zasito

回答

2

實數存儲爲浮點數。浮點運算並不精確:數字的值被存儲爲有效數字的固定數字,並且是固定數字的指數。

當您嘗試將浮點值作爲字符串打印時,數字格式爲「十進制實數」格式。對於這種格式,數字的值是四捨五入的(你想要一個精確的表示,而不是無限的數字)。

由於這種格式化,您看到的是「-0.1667」,它確實是實際價值的圓整形式。另一個符號-1.572218e + 26與真正的浮點表示非常相似。

我認爲當您談論「-0.1667」時,您正在談論打印到文件的原始值。但-1.667是你輸出變量的值(例如在控制檯上)時看到的值,而不是?這是重點:-1.667是一個四捨五入的值。真實值是「-1.572218e + 26」。

您正在以二進制模式將文件中的浮點值存儲在文件中,因此您在文件中打印出(二進制表示)的實際表示形式。閱讀文件時,您讀取的是之前存儲的相同值。當你把這個值放在std :: cout中時,cout會打印這個值,而不是舍入(這可以被配置)。

如果你想要四捨五入的格式,你可以使用setprecision來配置格式。

+0

哦!這解釋了很多。所以得到了最後一個問題,如果在同一個程序中我想將這些值用於別的功能(例如將它們用於其他功能),我該如何使用四捨五入的值。我如何使用setprecission? – Zasito

+0

'setprecision'僅用於打印值。將float傳遞給函數時不需要擔心。雖然我還沒有能夠重現科學記數法。我只能得到微小的舍入誤差。 – mwerschy

+0

@mwerschy那麼,如果我使用這個符號基本上是一樣的,如果我使用圓形的? – Zasito

相關問題