2013-05-18 42 views
2

我想出了下面的代碼:如何從文件中讀取雙精度值?

#include <stdio.h> 
#include <iostream> 
#include <fstream> 

int main() { 
    std::ifstream a0; 
    a0.open("data/a0", std::ios::in | std::ios::binary); 
    double d; 
    a0 >> d; 
    printf("%e\n", d); 
} 

g++ -s -Wall -Wextra -pedantic -std=c++0x -o program program.cpp 

編譯,但它不工作 - 它打印0(實際前8個字節的文件是3D 8F A0 BB E0 00 00 00)。 更有趣的是,當data/a0文件不存在時,會輸出垃圾,但是如果文件確實存在,則輸出始終嚴格爲0.

我在做什麼錯?

回答

3

如果是二進制文件,則必須使用格式化輸入功能與它:

double d; 
if (!a0.read(reinterpret_cast<char*>(&d), sizeof(d))) { 
    // error occurred 
} 
std::cout << d << '\n'; 

操作>>確實格式化輸入,這意味着它預計,在該文件中文本

編輯

對不起,最初使用get()代替read(),這對於以二進制格式讀取文本文件更爲有用。

+0

我一定是失明的(謝謝!是否有一種簡單的方法可以使這個閱讀成爲大尾序中的雙數? – Rogach

+0

@Rogach恐怕沒有,你必須將它讀入內存中'unsigned char [sizeof(double)]'或'std :: arrray '),並自己轉換它 – Angew

+0

哼。好吧,所以我不需要轉換。非常感謝! – Rogach

0

你確定文件格式實際上是二進制嗎?

如果您可以在文本編輯器中查看該文件,然後刪除ios :: binary標誌。

也嘗試使用%g作爲printf格式;這是正常顯示雙精度。

+1

'%e'對於'double'完全沒問題,它意味着指數表示法。 '%f'表示固定表示法,'%g'表示「使用更適合於double的特定值的表示法。」 – Angew

相關問題