fwrite 中的输出不符合预期

问题描述 投票:0回答: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;
}

输出不流畅,因为文件中包含奇怪的字符。

我也以二进制模式打开文件,但没有成功。这是某种缓冲区问题吗?

c file fwrite
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

请注意,偏移量

0x00
0x10
处的前四个字节是输入的数字(因为我的机器是小端和 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
© www.soinside.com 2019 - 2024. All rights reserved.