Recentl我已经开始在C中学习文件I / O,比如fopen fwrite和类似的东西。我有一个关于编写/读取具有指向文件指针的结构的问题。假设结构看起来像这样
struct {
int len;
int* data;
}intarr;
len是数组的长度
数据指向整数数组。
假设我知道结构是什么(所以我稍后可以读回来),我需要以二进制格式将len和数据写入文件。但是,如果我只将结构写入文件,则只将指针保存到文件中而不是内容中。
我目前的方法是将数据复制到新数组中,然后将len和新数组分别写入文件。
我不太确定我的方法是否正确。如果它是正确的,你应该如何阅读它们?如果没有,当我们想要用指针写入文件的所有内容时,我们应该做什么,以便我们以后可以读回来?... 我仍然是编程的新手,所以如果我说错了,请纠正我。
答案 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 members和fwrite(3)。请注意,stdio
文件流维护当前文件位置(因此数据按顺序写入,而不是覆盖),您可以使用ftell(3)进行查询。某些文件流(例如在pipe(7)以上的Linux上,即来自popen(3))是不可搜索的。
实际上,您可以使用JSON等文本格式序列化和/或使用database(例如Sqlite,PostgreSQL,MongoDb。 ..); textual格式更便于携带,更易于调试。而且由于磁盘的速度可能比CPU慢一百万倍,因此需要花费一些处理时间来在磁盘上组织数据。