2016-06-12 32 views
0

バイナリファイルの読み込みに問題があります。私は文字列を含むバイナリファイルを読むと完全に読み込まれます。しかし、私がこのようなものを読んでみると、intのバイナリファイルを文字列C++に読み込む

1830 3030 3030 3131 3031 3130 3000 0000 
0000 0000 0000 0000 1830 3030 3030 3131 
3030 3030 3100 0000 0000 0000 0000 0000 
1830 3030 3030 3131 3030 3131 3000 0000 
0000 0000 0000 0000 1830 3030 3030 3131 
3031 3030 3000 0000 0000 0000 0000 0000 
1830 3030 3030 3131 3031 3131 3100 0000 
0000 0000 0000 0000 1830 3030 3030 3131 
3130 3130 3100 0000 0000 0000 0000 0000 ... and so on 

それだけの部分が読み込まれます。これはバイナリファイルを読み込んで文字列に変換するコードです。

string toString (const char *c, int size); 

int main(int argc, char* argv[]) 
{ 
    streampos size; 
    char * memblock; 

    ifstream file (argv[1], ios::in|ios::binary|ios::ate); 
    size = file.tellg(); 
    memblock = new char[size]; 
    file.seekg (0, ios::beg); 
    file.read (memblock, size); 
    file.close(); 

    string input = toString(memblock,size); 
    cout << input << endl; //this prints just portion of it 000001101100 
    return 0; 
} 

string toString (const char *c, int size) 
{ 
    string s; 
    if (c[size-1] == '\0') 
    { 
     s.append(c); 
    } 
    else 
    { 
     for(int i = 0; i < size; i++) 
     { 
      s.append(1,c[i]); 
     } 

    } 

    return s; 
} 

しかし、0と1のtxtファイルを読み込もうとすると、うまく読み込まれます。 私はC++にはかなり新しく、なぜそうは分かりません。

+0

このデータをどのように出力するかを教えていただいた場合は、どのように表示するかを示すコードを書くことができます。 –

+0

また、memblock変数に割り当てられたメモリを解放していないようです。 – kyku

+0

hmm ...私は実際にこのファイルをLZWで別の.binファイルを圧縮するのを手に入れました。私はそれを.binに圧縮すると1830 3030 3030 3131が得られますが、.txtに圧縮されると000001101100が得られます。したがって、.binの部分は.txtと同じです。私が.txtファイルを解凍すると、私は間違いなくオリジナルを得る。しかし、私はそれがちょうどあるので、.binを解凍することはできません。私は読書に何かがあったと思っていました。 – mihcc

答えて

1

あなたの問題は、coutを使用していることです。これはバイナリではなく人間が読める文字列を出力するためのものです。だから、あなたはフラグを立てライン:

cout << input << endl; //this prints just portion of it 000001101100 

だけの部分を印刷します。

あなたが与えたバイナリデータにした

1830 3030 3030 3131 3031 3130 3000 0000 

ここでは、データの最初の行のASCIIれる:

<CAN> "000001101100" <NUL> <NUL> <NUL> 

最初<CAN>0x18ある - <NUL>は値0を持っています - それはcoutが停止するところです:0が出現するまで人間が読めるASCII値を出力します。あなたのデータは完全です。

文字の16進値を印刷する必要があります。これはかなり複雑な処理です。

+0

私は上記のコメントを書いたので、なぜこのファイルを読む必要がありますか? – mihcc

関連する問題