1

我正在学习 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;
       }

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

4

1 回答 1

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
于 2013-09-26T14:59:30.210 回答