2017-02-18 65 views
-1

我必須從一個二進制文件,在循環打印r15 [i]顯示正確的值(0000,fff6,....),但在一個特定的2字節值,但在循環之外,遍歷整個r15再次只顯示一個值0100. 從文件中讀取我逐字節地完成並將兩個值連接起來,並將其保存在r15 [counter]中。所以我的問題是,這是從二進制文件中讀取2字節值的正確方式嗎?以及什麼使陣列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顯示正確的值」是無關緊要的。它必須是5個大的容納4個chararcters,並且printf將追加一個空字符,所以它需要被聲明爲5個大字符。你在這裏很幸運。 –

回答

0

看:

r15[counter-1]=r; 

分配R鍵數組的地址,但你要分配R與所述陣列的值,所以使用:

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

...和r必須在5大以包括終止空。

另外,當分配存儲器時,您必須爲每個字符串分配5個字節。請閱讀關於C的書中的字符串。

+0

當我使用strcpy我得到警告:不兼容隱式聲明的內置函數'strcpy',甚至在改變r大小後沒有任何變化 –

+0

加:'#include '。你用malloc爲每個數組元素分配了5個字節嗎? –

+0

我沒有包括字符串,並改變了大小 –