2017-02-26 33 views
0

我使用節省10萬個整數二進制文件:C++讀取二進制文件的整數,丟失了一些數據

for(unsigned int i = 0; i < 100000; i++){ 
     temp = generateRand(99999); 
     file.write(reinterpret_cast<const char*>(&temp),sizeof(temp)); 
    } 

,並從該文件,我想讀整數,並將它們保存到一個載體。

ifstream ifile; 
ifile.open("test.bin",ios::binary); 

ifile.seekg(0, ifile.end); 
long size = ifile.tellg(); 
ifile.seekg(0, ifile.beg); 

int restore = 0; 
int count = 0; 

while(ifile.tellg() < size){ 
    ifile.read(reinterpret_cast<char*>(&restore), sizeof(restore)); 
    v.push_back(restore); 
    count++; 
} 

但是好像我只能讀99328點的整數,而不是100000我與讀取較新的/二進制文件,因此你們能幫助我嗎?

+0

'temp'的類型是什麼?你得到的文件大小是多少?你如何定義/打開'file'和'ifile'? – Ap31

+0

哦,temp是int類型的。 generateRand函數只是產生隨機整數。 –

+0

在閱讀之前關閉或摧毀'file'嗎? – Ap31

回答

2

貌似file對象仍處於打開狀態時的讀取開始,這導致所描述的行爲。

嘗試調用file.close()來刷新緩衝區,並且僅在初始化ifile之後。

你也會發現,立即讀取整個矢量可以大大加快這個過程。

+0

謝謝!你是對的。 –

2

它爲我工作。可能你忘了使用ios::binary標誌或關閉流?

#include <vector> 
#include <fstream> 
#include <iostream> 

using namespace std; 

void write() { 
    ofstream file; 
    file.open("temp.data", ios::binary); 
    for(unsigned int i = 0; i < 100000; i++){ 
    int temp = 0; // I don't know the generateRandom(...) function 
    file.write(reinterpret_cast<const char*>(&temp),sizeof(temp)); 
    } 
} 

void read() { 
    ifstream ifile; 
    ifile.open("temp.data", ios::binary); 

    ifile.seekg(0, ifile.end); 
    long size = ifile.tellg(); 
    ifile.seekg(0, ifile.beg); 

    int restore = 0; 
    vector<int> v; 
    while(ifile.tellg() < size){ 
    ifile.read(reinterpret_cast<char*>(&restore), sizeof(restore)); 
    v.push_back(restore); 
    } 

    cout << v.size() << endl; 
} 

int main() 
{ 
    write(); 
    read(); 

    return 0; 
} 
+0

謝謝。我必須file.close()來刷新緩衝區! –

+0

+1 - 更好的程序結構通過在輸出文件超出範圍時自動關閉輸出文件來解決問題。 –

+0

哦,所以如果你使用上面的函數 - write()和read()函數,你不需要明確地使用close()函數嗎? –