用C语言编写和读入文件

时间:2015-03-09 06:08:46

标签: c file-io struct

Recentl我已经开始在C中学习文件I / O,比如fopen fwrite和类似的东西。我有一个关于编写/读取具有指向文件指针的结构的问题。假设结构看起来像这样

  struct {
  int len;
  int* data;
  }intarr;

len是数组的长度

数据指向整数数组。

假设我知道结构是什么(所以我稍后可以读回来),我需要以二进制格式将len和数据写入文件。但是,如果我只将结构写入文件,则只将指针保存到文件中而不是内容中。

我目前的方法是将数据复制到新数组中,然后将len和新数组分别写入文件。

我不太确定我的方法是否正确。如果它是正确的,你应该如何阅读它们?如果没有,当我们想要用指针写入文件的所有内容时,我们应该做什么,以便我们以后可以读回来?... 我仍然是编程的新手,所以如果我说错了,请纠正我。

1 个答案:

答案 0 :(得分:2)

了解serialization& application checkpointing。另请阅读files& file systems

你可以fwrite len然后是数组内容:

 if (fwrite(&intarr.len, sizeof(int), 1, file)) != 1)
   { perror("write length failure"); exit(EXIT_FAILURE); };
 if (fwrite(intarr.arr, sizeof(int), intarr.len, file) != intarr.len)
   { perror("write array failure"); exit(EXIT_FAILURE); };

要重新读取数据(例如在rewind(3)之后或fopen之后 - file),首先读取长度,然后分配并读取数组:

 if (fread(&intarr.len, sizeof(int), 1, file)) != 1)
   { perror("read length failure"); exit(EXIT_FAILURE); };
 intarr.arr = malloc(sizeof(int)*intarr.len));
 if (!intarr.arr) { perror ("malloc failure"); exit(EXIT_FAILURE); };
 if (fread(intarr.arr, sizeof(int), intarr.len, file) != intarr.len)
   { perror("read array failure"); exit(EXIT_FAILURE); };

另请阅读flexible array membersfwrite(3)。请注意,stdio文件流维护当前文件位置(因此数据按顺序写入,而不是覆盖),您可以使用ftell(3)进行查询。某些文件流(例如在pipe(7)以上的Linux上,即来自popen(3))是不可搜索的。

实际上,您可以使用JSON等文本格式序列化和/或使用database(例如SqlitePostgreSQLMongoDb。 ..); textual格式更便于携带,更易于调试。而且由于磁盘的速度可能比CPU慢一百万倍,因此需要花费一些处理时间来在磁盘上组织数据。