2017-02-08 2 views
-2

イメージをchar配列にコピーしようとしています。ドキュメントの例のようですが、正しく動作しません。下のコードで何が間違っていますか?なぜこのコードはイメージをchar配列にコピーしませんか?

char* getImage(char* path){ 
    ifstream image; 
    image.open(path, ifstream::binary); 

    image.seekg (0, ios::end); 
    int n = image.tellg(); 
    printf("n = %d\n", n); 
    image.seekg (0, ios::beg); 

    char* res = new char[n]; 

    image.read(res, n); 

    if (image) 
     std::cout << "all characters read successfully." << endl; 

    printf("length = %d", strlen(res)); 
    cout<<res<<"\n\n"; 
    image.close(); 
    return res; 
} 

myプログラムの出力。

n = 6942 
all characters read successfully. 
length = 4 
+3

あなたのイメージは、おそらくヌルで終了する文字列ではありません。 std :: strlenはちょうど最初のゼロバイトでチョークし、 'std :: cout'は何も意味のあるものを表示することはできません。 – Quentin

+0

プログラムの出力を指定しました。良いように思える。あなたはそれが他に何かを出力すると思いましたか? – anatolyg

+0

イメージの長さは 'strlen(res)'ではなく 'n'です。それがあなたの過ちです。 – PaulMcKenzie

答えて

1

テストに問題があります。 strlenは、引数がNULL終端文字列であることを要求し、最初のNULLに遭遇する前にnullでない文字の数を返します。私はヌル終端されているイメージフォーマットがないことを知っているので、おそらくchar配列にはヌル終了文字が含まれているとは限りません。

出力ストリームにresを挿入すると(同じようにcout)、ヌル終了と同じ要件があるため、同様に障害が発生します。

画像ファイルの5番目のバイトは、ヌル終了文字と同じ表現をしているように見えますが、画像がコピーされていないわけではありません。

ifstream::gcountは、読み取りバイト数を照会するために使用でき、ostream::writeは、ヌル終了文字を含む場合と含まない場合がある文字配列の内容全体を出力するために使用できます。


PS。技術的には正しいのですが、動的オブジェクトを作成し、関数から裸のポインタを返すことは非常に悪い考えです。メモリリークやその他のバグが発生する可能性は非常に高いです。代わりにstd::vectorを使用することをお勧めします。

関連する問題