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

我有以下程序:

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

几个原因:

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

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

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

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

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

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