2012-03-01 9 views
1

私はバイナリの読み取りのためにはistreamを開いてるのchar配列を埋めるいないお読みください。はistream ::正しく

ifstream file; 
file.open (this -> fileName.c_str(), ios::binary); 

ファイルは、char配列のポインタに、良いですしながら、私は、その後、読み取ろう:

char data[numberOfBytes]; 
char * p = data; 
file.read(p, numberOfBytes); 
cout << "size: " << sizeof(p)  << end 
cout << "gcount: " << file.gcount() << endl; 
cout << "strlen: " << strlen(p)  << endl; 

上記のそれぞれの出力が異なります。 Sizeof()は、charポインタの正しいサイズである4を生成します。 gcount()は、numberOfBytesの値が何であれ生成します。しかし、strlen()は他の小さな番号を返します。したがって、read()はistreamポインタnumberOfBytesを移動しましたが、char配列にこれらのバイトがありません。私はchar配列のすべてのバイトが欲しいです。これをどのように達成するのですか?何が起こっている?

答えて

4

バイナリデータを読み込んでいる場合は、値がゼロのバイトまたは文字列のヌル文字を読み取っている可能性があります。

strlen()は、文字列の先頭から文字列のサイズを計算し、ヌル文字になるまでカウントします。

したがって、strlen()は、読み取られた実際のバイト数ではなく、ヌル文字までのバイト数を報告します。

+0

以下のすべての答えは正しいです。これは私の問題でした:私はudpソケットを介してデータ配列を送信していました。受信側では、再構築しなければならなかったので(つまり、istreamに書き込む)、バイト数は分かりませんでした。私は単純にその情報を私のパケット構造に追加しました。今はすべてが良いです、ありがとう! –

2

strlenは、最初のヌルバイトまでのバイト数を報告します。

2

機能strlenは、ゼロのバイトを検出するまでバイト数をカウントします。データがすべて印刷可能なキャラクターではないことがありますか?

1

バイナリ文字列にstrlenの原因となるEOFまたはNULLが存在する可能性があります。

3

はこれを試してみてください:

私はあなたがnumberOfBytesを初期化していないことを推測することができます。私はちょうどコピーし、印刷、それは私のために働いています:

//file test.C 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstring> 

using namespace std; 

int main() { 

    ifstream file; 
    file.open ("test.C", ios::binary); 
    char data[1024]; 
    char *p = data; 
    file.read(p, 1024); 
    cout << "size: " << sizeof(p)  << endl; 
    cout << "gcount: " << file.gcount() << endl; 
    cout << "strlen: " << strlen(p)  << endl; 
    cout << "data: " << p << endl; 

    return 0; 
}