输出与fwrite中的预期不符

时间:2013-09-26 14:51:56

标签: c file fwrite

我正在学习c的fread和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;
       }

输出不平滑,因为它在文件中包含奇怪的字符。我也以二进制模式打开文件但是徒劳无功。这是某种缓冲问题吗?

1 个答案:

答案 0 :(得分: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