2016-12-05 8 views
-1

0、..、2^32-1の範囲の符号なし整数を含むテキストファイルがあります。 各行には1つの整数(改行文字)が含まれています。符号なし整数を含むファイルを読み込み、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; 
} 

これは、使用してコンパイルされます。

ただし、最初の整数だけが出力されているようです。

は例えば、私は「BLA」は

1864754174 
2150244390 
1703231727 

コマンドの結果4でし含むファイルであるコマンド./compress < bla | wc -c

を走っており、私は期待できない12として。

+2

何を試しましたか?今、この質問は私にコードを与えているだけです。ほとんど落とされ、閉鎖されます。あなたの質問を編集することを忘れないでください。 –

+0

@Ben - あなたのコメントのために、コードを追加しました。 –

+3

これでうまくいきません。 [MCVE](http://stackoverflow.com/help/mcve) –

答えて

3

あなたの問題は、あなたが署名のないintの代わりにintを書こうとしていることです。 これらの2の間のdiffrenceは、それらのサイズではなく、バイトの使用です。すべてのビット表すときは、2 ^(インデクス-1)1

内のビットのintから始まるインデックスがunsiged INTのように使用される符号なし整数で

ちょうど最後のビット数とbeacuseの符号を表すときために使用されますあなたは小さい数字を表すことができます。

+0

これは、なぜ「int」を書くだけなのか説明しています – qxz

+0

これは実際に働いています。私の愚かなこと。ありがとう! –

0

あなたが正しく理解していれば、uintsを含むテキストファイルから読み込み、それらをバイナリファイルに書きたいと思っています。 読書:

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 intuint32_tに変更して、すべてのプラットフォームで32ビット幅であることを確認してください。

関連する問題