使用fwrite()将结构体写入文件

6
我有以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLEN 100

typedef struct {int key; char data[MAXLEN];} record;

main(int argc, char *argv[])
{
    int n, i;
    record x;
    FILE *fp;
    fp = fopen(argv[1], "w+");
    printf("How many records will be entered? \n");
    scanf("%d", &n);
    for (i=0; i<n; i++)
    {
        printf("Enter record: \n");
        scanf("%d", &x.key);
        scanf("%s", &x.data);
        fwrite(&x, sizeof(record), 1, fp);
    }
}

我正在做的是根据用户输入创建记录,并将这些“记录”存储到文件中。但是,当我使用fwrite()时,创建的文件中有许多奇怪的字符,而不是仅具有每个记录及其键和数据。有谁能告诉我为什么会写入所有这些奇怪的字符?


是的,我的错误,我已经修正了标题。 - me45
3个回答

4
几个原因:
1. 当使用scanf时,它将人类可读的表单(%d)转换为计算机直接使用的形式(int)。然后,您将计算机可读形式写入文件。现在,当查看文件时,您不是使用反向的计算机到人类可读形式,而是使用低级别的形式。这将给出看起来不正确的结果。
2. 您正在写出整个x.data,即使您可能已经读取部分数据(例如,读取长度为10的字符串)。 x.data的其余部分是“未初始化”的,并包含main()被调用时留在内存中的任何内容。

1

我在读取软盘映像文件中的BIOS参数块结构时也遇到了类似的问题。我通过使用#pragma pack(1)指令来解决它。以下是示例代码:

#pragma pack(1)
struct bpb
{
    unsigned char jmpinstruction[3];
    unsigned char oem[8];
    short bytespersector;
    ....
};
#pragma pack()

0

它将数据存储为二进制记录,而不是纯文本。

您无法使用记事本查看它。

要查看记录,您需要编写另一个程序,将记录从文件中读取到相同的结构中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接