2016-04-16 14 views
2

ファイルから画像を読み取る際に問題がありますが、生のテキストがある場合は正しく動作します。どのファイルもバイナリモードで読むことができますが、出力は\ FF \ D8 \ FF \ E0です。それはこのキャラクターで終わるので、私はそれがただそのキャラクターか何かを解決できないのかどうかはわかりません。誰が何が間違っているのか分かりますか?前もって感謝します。ここでファイルから画像を読み取る - C++

は私のコードは

char* obsah; 
std::string sprava; 
std::ifstream is (file.c_str(), std::ifstream::binary); 
    if(is){ 
     is.seekg (0, is.end); 
     int length = is.tellg(); 
     is.seekg (0, is.beg); 
     obsah = new char [length]; 
     is.read(obsah,length); 
     sprava = prepinac+"\r\n"+file+"\r\n\r"+obsah; 
    } 
    else exit(EXIT_FAILURE); 
+0

あなたは長さを表示してい?出力はどこですか? obsahとprepinactはどのように定義されていますか? – Christophe

+0

char * obsah; std :: string prepinac、sprava ..そして、私は、長さが1000以上です。 –

答えて

2

spravaだ文字列です。 +を使用してコンポーネントを連結すると、char* obsahがヌル終端のC文字列として管理されます。したがって、最初のNULL文字の後のすべてはspravaにコピーされません。

編集:

あなたは、文字列(hereを参照)で'\0'を含むバイナリデータを持つことができます。しかし、この方法では、文字列をNULL終了C文字列のように処理されるchar*ポインタに変換すると、文字列の一部が無視される可能性があるため、非常に注意する必要があります。また、I/Oで文字列を使用すると、奇妙な結果が出る可能性があります。

ただし、進めたい場合は、std::copy()back inserterを使用できます。

ここ
sprava = prepinac+"\r\n"+file+"\r\n\r"; 
    copy(obsah, obsah+length, back_inserter<string>(sprava)); 

online demo

+0

大丈夫ですので、どのようなresonableソリューションですか? –

+0

文字列内でヌル文字を管理することは可能ですが、文字列以外の関数、C文字列への変換、およびI/Oには特別な注意が必要です([here](http://stackoverflow.com/questions/7416539/is-the-stdstring-can-hold-0-character-by-design))。 1つの可能な解決方法は、 'std :: copy()'(resize()spravaのどちらかを実行する前にobsahをspravaにコピーするか、またはコピーを実行するのに十分な長さにするか、またはバックインサータを使用することです) – Christophe

+0

@Pavolmodrý詳細を説明する編集 – Christophe

関連する問題