C中的fread / fwrite

时间:2016-02-10 22:44:42

标签: c file io fwrite fread

我们说我有这些参数:

 name | row 
------+-----
 a    |   1
 b    |   2
 c    |   3
 d    |   4
 e    |   5
(5 rows)

假设bool array_serialize(const void *src_data, const char *dst_file, const size_t elem_size, const size_t elem_count); 是我想写入src_data的数组。

我无法弄清楚如何使用dst_file。我知道fwrite需要四个参数:

  • fwrite - 这是指向要写入的元素数组的指针。
  • ptr - 这是要写入的每个元素的大小(以字节为单位)。
  • size - 这是元素的数量,每个元素的大小都是字节大小。
  • nmemb - 这是指向输出流的stream对象的指针。

但我遇到的问题是FILE属于*dst_file类型。如何将其转换为适当的类型才能使用const char? 我试过了

fwrite

但显然这是不正确的。

同样适用于fwrite(src_data, elem_size, elem_count, dst_file); 的问题。

2 个答案:

答案 0 :(得分:3)

首先阅读参考两次fwrite()fread()

最后一个参数应该是文件ponter,所以这样做:

fp = fopen(dst_file, "w+");
if(fp != NULL) {
    fwrite(src_data, elem_size, elem_count, fp);
    rewind(fp);
    fread(result_data, elem_size, elem_count, fp);
}

查看more examples

答案 1 :(得分:0)

const char实际上是一种字节类型,您可以将其强制转换为您想要的任何类型。 如果你有一个存储有已知模式的二进制文件(你最好),你可以通过成员大小将类型读入目标结构。

例如,如果你有一个包含两个变量的结构

struct foo {
  int f1;
  int f2;
};

而且你知道整个文件都是由这些组成的,那么你可以像这样从文件中获取值

fread(&target, sizeof(foo), num_elems, fp)

您可以根据您正在阅读或书写的文件进行冲洗和重复。

此外,您可以构建文件以包含标题,告诉您存储的数据类型以及存储的数据数量,这样您就可以在单个文件中包含变量结构。