fwrite将垃圾值写入文件

时间:2013-10-05 09:19:50

标签: c fwrite

#include <stdio.h>

struct struct_type
{
  int d;
};

int main()
{

  struct struct_type *cust;

  cust->d=13;

  FILE* fp;

  fp = fopen("path to file", "wb+");

  or,

  fp = fopen("path to file", "w+");     

  fwrite(cust, sizeof(struct struct_type), 1, fp);

  fclose(fp);

  return 0;

}

预期输出

13

但是将垃圾值写入文件。

2 个答案:

答案 0 :(得分:5)

假设您已为cust分配内存,或使用普通结构而不是指针,您将获得一个文件,其中包含您平台上int 13的二进制表示。例如,在记事本中这是不可读的。

如果你看一下十六进制编辑器中的输出,你会看到几个零字节和一个0xOD - 零字节数取决于你平台上的整数大小,以及它们是否是13字节之前或之后取决于其字节顺序。

如果您希望文件中包含13作为文字,请使用fprintf

(由于你没有分配内存,你的程序有不确定的行为,可以做任何事情。)


修复堆栈上的结构:

#include <stdio.h>

struct struct_type
{
  int d;
};

int main()
{
  struct struct_type cust;
  cust.d=13;

  FILE* fp;
  fp = fopen("path_to_file", "wb+");
  fwrite(&cust, sizeof(cust), 1, fp);
  fclose(fp);

  return 0;
}
$ gcc -Wall -std=c99 -pedantic t.c
$ ./a.out 
$ hexdump -C path_to_file 
00000000  0d 00 00 00                                       |....|
00000004

要获取文本文件,请将fwrite替换为:

fprintf(fp, "%d", cust.d); // or "%d\nd";

并从开放模式中删除“b”,因为这是二进制I / O.

答案 1 :(得分:2)

将menory分配给结构指针cust

fwrite(cust, sizeof(struct struct_type), 1, fp);

将二进制数据写入文件。

存在的数据是二进制数据,即非垃圾。

如果你想查看它是否正确写入对象和打印。

使用fread()

其他明智的做法是将整数转换为字符串并写入文本文件。

然后你就可以看到13。