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

时间:2012-12-07 05:30:20

标签: c file struct fwrite

我有以下程序:

#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()时,创建的文件中会写入许多奇怪的字符,而不是简单地让每条记录都包含其键和数据。有人能告诉我为什么写这些奇怪的人物吗?

3 个答案:

答案 0 :(得分:4)

有几个原因:

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

答案 1 :(得分:1)

从软盘映像读取BIOS参数块结构时,我也遇到了同样的问题。我使用#pragma pack(1)指令解决了这个问题。示例代码如下:

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

答案 2 :(得分:0)

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

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

要查看记录,您必须编写另一个程序,将文件中的记录读入相同的结构。