所以我试图从我的p->有效载荷向stdout写一些东西,它应该是一个指向数据的指针。 block_size是256。
我的问题是如果我切换p-> block_size和sizeof(char),我的标准输出将始终完全相同。有人可以告诉我为什么吗?感谢。
fwrite(p->payload, p->block_size,sizeof(char),stdout);
答案 0 :(得分:2)
通常,只假设将写入size * items
个字节。
这似乎是尝试镜像fread
API,其中还包含size
和bytes
参数。对于fread
,这更有用,因为(例如)你可以要求它读取一个1000字节的项目 - 意思是“我想要1000字节” - 或者你可以要求它读取1000项每个字节一个字节 - 意思是“我将占用1000个字节;数据少于此值。”显然,如果您读取的数据是固定大小的话,可以使用许多有用的组合。
但是,在fwrite
的情况下,您期望写入少于size * items
个字节的唯一时间将处于错误状态。在“磁盘已满”错误的情况下,您可以假设选择size
和items
,这样您就可以编写尽可能多的完整项目,但从不写半项;但是,我从来没有见过任何人真正编写以这种方式工作的代码,并且不会在磁盘已满时失败。
答案 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',所以你有相同的数字切换stream
和size
后写入nmemb
的字节数。