在C中,fwrite()的“size_t size”和“size_t n items”混淆

时间:2014-02-14 02:38:42

标签: c linux file struct io

所以我试图从我的p->有效载荷向stdout写一些东西,它应该是一个指向数据的指针。 block_size是256。

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

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

3 个答案:

答案 0 :(得分:2)

通常,只假设将写入size * items个字节。

这似乎是尝试镜像fread API,其中还包含sizebytes参数。对于fread,这更有用,因为(例如)你可以要求它读取一个1000字节的项目 - 意思是“我想要1000字节” - 或者你可以要求它读取1000项每个字节一个字节 - 意思是“我将占用1000个字节;数据少于此值。”显然,如果您读取的数据是固定大小的话,可以使用许多有用的组合。

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

答案 1 :(得分:2)

不同之处在于它返回的值。

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

如果你执行

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

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

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

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

如果您需要区分部分成功和完全失败,区别可能会有用。如果部分写入并不比不写任何东西更好,则可以使用第二种形式。

(表现不太可能有任何显着差异。)

另请参阅this similar question关于fread

答案 2 :(得分:0)

根据fwrite(3)

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

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

这意味着fwrite()会将{size * nmemb'字节从ptr写入stream,因为'size * nmemb'等于'nmemb * size',所以你有相同的数字切换streamsize后写入nmemb的字节数。