2014-11-04 202 views
1

我想從包含100個double值的二進制文件中讀取數值數據,並將其存儲在名爲myArray的數組中。當我打印myArray時,沒有顯示任何內容,就好像myArray從未填充過。任何幫助表示讚賞。將數值從二進制文件存儲到數組中 - C++

int main() 
{ 
    int file_len; 
    ifstream infile; 
    infile.open("mybinfile.bin", ios::binary | ios::in); 
    if (!infile.is_open()) 
    { 
    cout << "Error in opening the file. " << endl; 
    } 
    else 
    { 
     const int file_len = 100; 

     std::vector<char> myVect; 
     myVect.resize(file_len); 

     int i = 0; 
     infile.read((char *) (&temp), sizeof(char)); 
     myVect[i] = temp; 
     while(!infile.eof()) 
     { 

      myVect[i] = temp; 
      i++; 
      infile.read((char *) (&temp), sizeof(char)); 
     } 
     for (int i = 0; i < 100 ; i++) 
     {cout << i << ": " << myVect[i]<< endl;} 
    }  
    infile.close(); 

return 0; 
} 
+0

'temp'未定義。 – greggo 2014-11-04 16:37:43

回答

1

這裏

infile.read((char*)&myArray, file_len * sizeof(double)); 

您傳遞指針的指針翻番。它應該是

infile.read((char*)myArray, file_len * sizeof(double)); 

讓我想知道爲什麼你沒有看到崩潰,因爲寫入隨機存儲器幾乎從來沒有結果。

+0

你是對的!我已更正了代碼。但是,問題是我的文件中的值爲0-255,並且帶有'infile.read((char *)(&temp),sizeof(char));'我可以將字符等同於ascii數值。我怎樣才能不使用類型轉換直接提取數值到myVect? – QuestionMark 2014-11-04 14:57:47

+0

@QuestionMark這只是一個演員,讓infile.read(...)高興。從你未經編輯的問題,我假設你喜歡讀一連串的雙倍。如果文件的作者具有相同的大小和格式的雙打你可以留下它簡單的**雙溫度; infile-read((char *)&temp,...); ** – Oncaphillis 2014-11-04 16:01:18

+0

@QuestionMark如此讀入一個double數組。見Erik的答案。不過,您需要在傳遞給read()時將地址轉換爲char *。你可以做'infile.read((char *)&myVect [0],file_len * sizeof(double))'例如 – greggo 2014-11-04 16:40:49

1

下面是蠻力序列化和反序列化的一個例子。請注意,序列化通常是棘手的,由於例如字節順序,不同的浮點格式,十進制文本表示和二進制之間的轉換等等。

#include <fstream> 

using std::string; 
using std::ofstream; 
using std::ifstream; 
using std::cout; 

string fname("/tmp/doubles.bin"); 

void write_doubles() 
{ 
    ofstream of; 
    of.open(fname.c_str(), std::ios::binary | std::ios::out); 

    double arr[100]; 

    for (int i = 0; i < 100; i++) 
    { 
     arr[i] = static_cast<double>(i+100); 
    } 

    of.write((char*)arr, 100*sizeof(double)); 
} 

void read_doubles() 
{ 
    ifstream ifs; 
    ifs.open(fname.c_str(), std::ios::binary | std::ios::in); 

    double arr[100]; 
    ifs.read((char*)arr, 100*sizeof(double)); 


    for (int i = 0; i < 100; i++) 
    { 
     cout << "Arr[i]: " << arr[i] << ", "; 
    } 

    cout << '\n'; 


} 

int main() 
{ 
    write_doubles(); 
    read_doubles(); 

    return 0; 
} 
相關問題