2013-05-20 78 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

相关问题