2017-03-25 17 views
0
char* full_string; 
int size; 
FILE* f = fopen(filename,"r"); 

fseek(f,0,SEEK_END); 
size = ftell(f); 
fseek(f,0,SEEK_SET); 
full_string = malloc(size+1); 
fread(full_string,1,size,f); 
fclose(f); 

full_string[size] = '\0'; 

私は上記のコードで "full_string"という名前のバッファにファイルの内容を読み込もうとしていますが、gdbをステップ実行すると、次のものが格納されています代わりに「full_string」:イメージファイルの内容をバッファに読み込む

full_string = 0xa46df0 "\377\330\377", <incomplete sequence \340> 

を私はCで、完全な初心者ですので、私はこの問題をどのように解釈するか見当がつかない。私が読んでいるファイルはイメージファイルであることに言及する価値があります。これらの画像の大部分は50,000バイト以上のサイズです。どんな助けでも大歓迎です!

+3

'full_string'で何を期待していますか?デバッガは文字列として解釈しようとしていますが、イメージは文字列ではありません。したがって、あなたの*コード*はうまくいくかもしれませんが、*デバッガー*は混乱するかもしれません。 –

+0

@ScottHunterまたはそのような巨大な文字列を表示することができない – fvu

+0

"文字列"は0で終わり、 'char *'(または 'char *'に崩壊する 'char []'物事に渡されたとき)。その非常に特殊な形式以外のものを置くと、文字列を作成していないので、一連のバイトを作成しています。 GDBはあなたが文字列を作っていないことを知りません。どうした?だから、それは文字列であると仮定し、文字列ではないので文字列として解釈するときにはエラーになります。 –

答えて

0

char *は自動的に文字列を意味しません。 Cの文字列は、一連のバイトで、char *(またはchar []が格納されていますが、に格納されていますが、この回答では同じものとみなされます)。その一連のバイトは、ヌルバイトの'\0'で終わり、内部のどの位置にも含まれていなければなりません。

16進エディタでその特定のファイルを開くと、私は(a)が8進数の変換権を得て、(b)他の間違いはないと仮定して、おそらくFF D8 FF E0 00のようなものが表示されます。これはファイル内では有効ですが、それを文字列として解釈しようとすると(たとえば、strlen、またはGDBの場合)~50000文字未満のため、〜50000文字の期待値は得られません最初のヌルバイトの前。これはまた、'\0'であなたの "文字列"を終了することは意味がないことを意味します。つまり、ではなく、という文字列です。これは一連のバイトです。

長さが重要な場合は、要件が何であるかに応じて、長さを構造体または別の変数に格納する必要があります。

関連する問題