【问题标题】:fread/fwrite in CC中的fread/fwrite
【发布时间】:2016-02-10 22:44:42
【问题描述】:

假设我有这些参数:

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 - 这是元素的数量,每个元素的大小为 size 字节。
  • stream - 这是指向指定输出流的FILE 对象的指针。

但我遇到的问题是*dst_fileconst char 类型。如何将其转换为合适的类型才能使用fwrite? 我试过做

fwrite(src_data, elem_size, elem_count, dst_file);

但显然这是不正确的。

fread 也有类似问题。

【问题讨论】:

  • C 和 C++ 是不同的语言!
  • 你需要先fopen文件...
  • 而且堆栈溢出是没有辅导网站的。请阅读函数的手册页或查阅 C 书籍 - 可能在每本 C 书籍中都有解释。

标签: c file io fwrite fread


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复。我现在感觉自己像个白痴。在下一次发布之前,我会花更多时间研究。当我被允许时,我会接受。
  • @MikeHenke 从错误中吸取教训,不要感到羞耻。 ;) 如果可以的话,我会投票给你,但我的票数有限。
【解决方案2】:

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

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

struct foo {
  int f1;
  int f2;
};

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

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

您可以根据正在读取或写入的文件冲洗并重复此操作。

此外,您可以将文件构造为具有标题,这些标题告诉您存储的数据类型以及它们的数量,这允许您在单个文件中具有可变结构。

【讨论】:

  • 请注意,自从我写任何 C 以来已经有大约 6 个月了,所以我的代码中可能有错误
  • 抱歉 - 您的代码中没有真正的错误(尽管读写 structs 可能存在填充问题,因此需要对此进行说明),但它没有回答 OP 关于正确参数类型的问题对于dst_file
  • 正确的参数类型是任何指向数据类型的指针。关于填充的好点,这将是我摆脱 c 编码的地方。
  • 我想我误解了这个问题
猜你喜欢
  • 2016-12-29
  • 1970-01-01
  • 2020-12-14
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多