簡體   English   中英

.read()reinterpret_cast <char *> C ++

[英].read() reinterpret_cast<char *> c++

我有一個帶有二進制文件的雙打文件(精確到9,對於3x3矩陣)。 我試圖將它們用作它們表示的實際雙精度值(數字ej:5.66 / -1.882 /等。)。

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

然后,我有一個結構體,該結構體的指針指向9個插槽(0-8)的向量,我想用雙精度值SO來填充,這是到目前為止我正在嘗試的方法:

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 :: cout檢查值時,我在控制台上打印了一些奇怪的數字:

-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.1667”就是其實際值的四舍五入形式。 另一種表示法-1.572218e + 26與真正的浮點表示法非常相似。

我以為,當您談論“ -0.1667”時,您是在談論打印到文件的原始值。 但是-1.667是輸出變量的值時看到的值(例如在控制台上),不是嗎? 這就是要點:-1.667是四舍五入的值。 真實值為“ -1.572218e + 26”。

您將浮點值以二進制模式存儲在文件中,因此您在文件中打印數字的真實表示形式 (二進制表示形式)。 讀取文件時,讀取的值與之前存儲的值相同。 當您將此值放入std :: cout時,cout會打印該值,而不會四舍五入(可以配置)。

如果要舍入格式,則可以使用setprecision配置格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM