2016-12-05 66 views
-1

我有一個文本文件,其中包含範圍爲0,..,2^32-1的無符號整數。 每行包含一個整數(和一個換行符char)。讀取包含無符號整數的文件並將其寫入C++中的二進制文件

我想寫入一個二進制文件來節省空間(這樣每個int將佔用4個字節)。什麼是最好的方式來做到這一點?

我試了幾個選項,他們都沒有似乎工作。幫助將不勝感激。

電流(非工作)代碼: g++ compress.cc -o compress

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

int main(){ 
    int x; 
    while (std::cin >> x){ 
     fwrite((void*)&x, sizeof(x), 1, stdout); 
    } 
    return 0; 
} 

它使用編譯。

但是,它似乎只輸出第一個整數。

例如,具有我跑的命令./compress < bla | wc -c

其中「BLA」是含有

1864754174 
2150244390 
1703231727 

該命令的結果是一個4文件,而不是作爲12我的預期。

+2

您嘗試了什麼?現在,這個問題只是給我的代碼。幾乎立即就會下調和關閉。請記住編輯你的問題,不要在評論部分回答這個問題。 –

+0

@Ben - 增加了代碼,感謝您的評論。 –

+3

好吧,現在什麼不行?請閱讀如何創建[MCVE](http://stackoverflow.com/help/mcve) –

回答

3

你的問題是你正在嘗試寫int而不是unsigned int。 這些2之間的差異不是它們的大小,而是字節的使用。

在無符號整型

每個比特reprsent 2 ^(指數-1)指數從1

在INT中的位開始使用等unsiged INT剛剛過去的位用於reprsent數量和怎麼一回事,因爲的符號你可以代表較小的數字。

+0

這是否解釋了爲什麼它似乎只寫了一個'int' – qxz

+0

這實際上已經奏效。我多麼愚蠢。謝謝 ! –

0

如果我正確地理解了你,你想從包含uint的文本文件中讀取並將它們寫入二進制文件。 閱讀:

std::vector<unsigned int> readUints(const std::string& filepath){ 
    std::vector<unsigned int> numbers; 
    std::ifstream file(filepath); 
    if(!file.is_open()){ 
     //Handle file not found 
    } 
    unsigned int number = 0; 
    while(file >> number){ 
     numbers.push_back(number); 
    } 
    return numbers; 

寫作:

void writeUints(const std::vector<unsigned int>& numbers, const std::string& filepath){ 
    std::ofstream file(filepath, ios_base::binary | ios_base::out); 
    if(!file.is_open()){ 
     //Handle file not found 
    } 
    for(int i = 0; i < numbers.size(); i++){ 
     file.write(reinterpret_cast<char*>(&numbers[i], 4); 
    } 
} 

確保包括<fstream>。您可以將unsigned int更改爲uint32_t,以確保它在每個平臺上都精確到32位。

相關問題