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

4

3 回答 3

4

几个原因:

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

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

#pragma pack(1)
struct bpb
{
    unsigned char jmpinstruction[3];
    unsigned char oem[8];
    short bytespersector;
    ....
};
#pragma pack()
于 2013-05-11T17:09:58.117 回答
0

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

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

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

于 2012-12-07T05:38:49.403 回答