2013-09-26 73 views
1

我正在學習fread和fwrite的c,並且使用fwrite在文件中編寫了一個結構的基本代碼。輸出在那裏fwrite中的輸出不如預期

 #include<stdio.h> 
     int main() 
     { 
     FILE *f; 
     int i,q=0; 
     typedef struct { 
         int a; 
         char ab[10]; 
     }b; 
     b var[2]; 
     f=fopen("new.c","w"); 
     printf("Enter values in structure\n"); 
     for(i=0 ; i<2 ; i++) 
     { 
      scanf("%d",&var[i].a); 
      scanf("%s",var[i].ab); 
     } 
     fwrite(var,sizeof(var),1,f); 

     fclose(f); 
     return 0; 
     } 

輸出不光滑,因爲它包含文件中的怪異字符。我也用二進制模式打開文件,但是徒勞無功。這是一種緩衝區問題嗎?

+0

fwrite的參數可能需要調整。第三個參數有「1」,告訴它你只想輸出1個元素。對於第二個參數,你需要元素大小,它應該是字節。 (int和char是兩個不同大小的粗體,所以公分母是字節大小的輸出)。嘗試'fwrite(var,1,sizeof(var),f);' – ryyker

+0

@ryykker,OP的代碼很好。 –

+0

@CarlNorum - 同意了,我離開了,使用fprintf(正如你所建議的那樣),它工作正常。謝謝。我可以問一下你用什麼工具來獲得文件偏移,數據和關係列? – ryyker

回答

2

文件中的「怪異」字符可能是您寫出的二進制整數的字節。 fwrite正在將var的位直接寫入文件,而不是將其轉換爲可讀格式。如果你想要的話,請用fprintf代替。

這裏從上面的代碼,直接是一個例子:

$ ./example 
Enter values in structure 
5 hello 
8 world 
$ hexdump -vC new.c 
00000000 05 00 00 00 68 65 6c 6c 6f 00 00 00 00 00 00 00 |....hello.......| 
00000010 08 00 00 00 77 6f 72 6c 64 00 00 00 00 00 00 00 |....world.......| 
00000020 

注意,在第一個四個字節偏移0x000x10是數字輸入的(因爲我的機器上的小尾數和32位),隨後通過輸入的字符串,加上一些結構填充。全部故障:

File Offset  Data (ASCII)  Relationship to source 
    0    05    var[0].a 7:0 
    1    00    var[0].a 15:8 
    2    00    var[0].a 23:16 
    3    00    var[0].a 31:24 
    4    68 (h)   var[0].ab[0] 
    5    65 (e)   var[0].ab[1]    
    6    6c (l)   var[0].ab[2] 
    7    6c (l)   var[0].ab[3] 
    8    6f (o)   var[0].ab[4] 
    9    00 (NUL)   var[0].ab[5] 
    10    00 (NUL)   var[0].ab[6] 
    11    00 (NUL)   var[0].ab[7] 
    12    00 (NUL)   var[0].ab[8] 
    13    00 (NUL)   var[0].ab[9] 
    14    00    structure padding 
    15    00    structure padding 
    16    08    var[1].a 7:0 
    17    00    var[1].a 15:8 
    18    00    var[1].a 23:16 
    19    00    var[1].a 31:24 
    20    77 (w)   var[1].ab[0] 
    21    6f (o)   var[1].ab[1]    
    22    72 (r)   var[1].ab[2] 
    23    6c (l)   var[1].ab[3] 
    24    64 (d)   var[1].ab[4] 
    25    00 (NUL)   var[1].ab[5] 
    26    00 (NUL)   var[1].ab[6] 
    27    00 (NUL)   var[1].ab[7] 
    28    00 (NUL)   var[1].ab[8] 
    29    00 (NUL)   var[1].ab[9] 
    30    00    structure padding 
    31    00    structure padding 
+0

所以整數不可讀,但字符串是可讀的,爲什麼?這只是整數的情況,那麼爲什麼使用fwrite來打印結構呢? – mrigendra

+1

因爲字符串已經是人類可讀的格式。一個整數不是 - 它只是一個數字。你還會期待什麼?你甚至使用'scanf' ...我認爲你需要回到關於計算機如何存儲數據的基礎知識。 –

+0

「因爲一個字符串已經是一種人類可讀的格式,一個整數不是 - 它只是一個數字,你還會期望什麼?甚至可以使用scanf ......」是結構)與字符串(或字符)混合到一個文件將不會在一個可讀的形式,因爲?? ..請解釋我在基礎知識。 – mrigendra