【问题标题】:in C, fwrite()'s "size_t size" and "size_t n items" confusion [duplicate]在 C 中,fwrite() 的“size_t size”和“size_t n 个项目”混淆[重复]
【发布时间】:2014-02-14 02:38:42
【问题描述】:

所以我试图从我的 p->payload 向标准输出写入一些东西,这应该是指向数据的指针。而block_size是256。

我的问题是,如果我切换 p->block_size 和 sizeof(char),我的标准输出总是完全相同。有人能告诉我为什么吗?谢谢。

fwrite(p->payload, p->block_size,sizeof(char),stdout);

【问题讨论】:

  • 请注意,使用参数p->block_sizesizeof(char),除非p->block_size1,否则颠倒参数的顺序会更改fwrite() 返回的值。它报告已写入的给定大小的项目数,因此在一种情况下,您将在成功时返回 p->block_size(错误时返回 0),在另一种情况下,您将在成功时返回 1(和 0 错误)。

标签: c linux file struct io


【解决方案1】:

区别在于它返回的值。

fwrite 返回写入的数据元素个数。

如果你执行

count = fwrite(ptr, 1, N, stdout);

然后count 将包含成功写入的确切字节数。如果你这样做:

count = fwrite(ptr, N, 1, stdout);

如果整个写入成功,count 将包含 1,如果 任何 失败,则包含 0

如果您需要区分部分成功和完全失败,这种区别可能很有用。如果部分写不比什么都不写好,你可以使用第二种形式。

(性能上不太可能有任何显着差异。)

另请参阅this similar question 关于fread

【讨论】:

    【解决方案2】:

    一般来说,假设size * items 字节将被写入。

    这似乎是对fread API 的一种尝试,它也有sizebytes 参数。对于fread,这更有用,因为(例如)您可以要求它读取 1000 字节的一项——意思是“我想要 1000 字节”——或者你可以让它读取 1000 字节的一项一个字节——意思是“我最多需要 1000 个字节;比这少的数据是可以的。”显然,如果您正在读取的数据是固定大小的,那么这里可以使用很多有用的组合。

    fwrite 的情况下,您唯一期望写入的字节数少于size * items 的情况是出现错误情况。在“磁盘已满”错误的情况下,您可以假设选择sizeitems,这样您就可以写尽可能多的完整项目,但不要写半个项目;但是,我从未见过有人真正编写过以这种方式工作的代码,而且不仅会在磁盘满时失败。

    【讨论】:

      【解决方案3】:

      根据fwrite(3)

      size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
      

      函数fwrite()将数据的nmemb个元素,每个size字节长,写入stream指向的流中,获取它们从 ptr 给出的位置。

      这意味着fwrite() 将从ptr 写入'size * nmemb' 字节到stream,因为'size * nmemb' 等于'nmemb * size',所以你有相同数量的字节写入@987654327 @在切换sizenmemb之后。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-08
        • 2021-12-29
        • 2020-05-06
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 2013-06-27
        相关资源
        最近更新 更多