2017-02-18 8 views
-1

バイナリファイルから特定の2バイト値を取得する必要があります。ループ印刷r15 [i]の中に正しい値(0000、fff6、....)ループの外側で、r15全体を繰り返し繰り返し、1つの値0100を表示します。 ファイルからバイトごとに読み込み、2つの値の値を連結してr15 [カウンタ]に保存します。だから私の質問は、バイナリファイルから2bytesの値を読み取る正しい方法ですか?そして、ループの最後で配列r15の値を変更するのは何ですか?バイナリから読み込んだり、ストリングをダブル配列の文字列

char **r15; 
    r15 = (char **) malloc(sizeof(char *)*50000); 

    for(i=0; i<50000; i++) r15[i] = (char *) malloc(sizeof(char)*5); 

fp = fopen("file.bin", "rb"); 

if (fp == NULL) { 
    printf("fail opning file\n"); 
    exit(EXIT_FAILURE);}   

int i; 
int check; 
char r[5]; 
unsigned int counter=1; 


    while((check=getc(fp)) != EOF){ 
     fseek(fp,32*counter-2, SEEK_SET); 

     fread(buffer,1,2,fp); 

     sprintf (r, "%02x%02x", buffer[0], buffer[1]); 
     r15[counter-1]=r; 
     printf("r15[%d] %s\n",counter-1,r15[counter-1]); 

     counter++; 
    } 

// result here diffrent than printing inside while loop 
for(i=0;i<counter-1;i++) printf("r15[%d] %s\n",i,r15[i]); 

edit1:まだrサイズを5に変更しても、ループ内に印刷された値は外側に印刷された値とは異なります。 EDIT2:これで

r15[counter]=r; or strcpy(r15[counter],r); 

::私は交換することで解決策を見つけた

r15[counter][0]=r[0]; 
    r15[counter][1]=r[1]; 
    r15[counter][2]=r[2]; 
    r15[counter][3]=r[3]; 

それはstrcpyのはstrncpyとR15では動作しなかった理由はまだ私はそれを得ることはありません[カウンター] = rでの

+0

"ループ内にr15を印刷すると正しい値が表示されるので"を参照してください。 4文字の文字を保持するには5つの大きさでなければならず、printfはヌル文字を追加するので、5つの大きな文字として宣言する必要があります。あなたはここで幸運でした。 –

答えて

0

ルック:

r15[counter-1]=r; 

あなたは配列にRのアドレスを割り当てていますが、割り当てたいですアレイへのRの値が、それほど使用:

strcpy(r15[counter-1], r); 

...とrが終端ヌルを含むように5大きくなければなりません。

また、ストレージを割り当てるときは、各文字列に5バイトを割り当てる必要があります。あなたの本の文字列については、

+0

私はstrcpyを使用すると警告が表示されます:組み込み関数 'strcpy'の暗黙の宣言が互換性がなく、rサイズを変更しても何も変わらない –

+0

追加: '#include '。配列要素ごとに5バイトをmallocで割り当てましたか? –

+0

私は文字列を含めてサイズを変更しました –

関連する問題