当所有字符都写入完成后,fwrite还会出现写错误吗?
在C23草案 n3220 中,我在阅读关于 fwrite 的描述。标准对7.23.8.2p3中 fwrite 的返回值作了如下说明:
Returns
Thefwrite函数返回成功写入的元素数量,该数量将小于nmemb仅在 发生写入错误时才会如此。如果size或nmemb为零,fwrite返回零,流的状态保持不变。
- 因此,如果写入的元素数量小于
nmemb,那么我就知道发生了写入错误。 - 那如果写入的元素数量等于
nmenb呢?是否可能发生写入错误?
这条规则的措辞暗示,可能在输出流中成功写入所有元素的同时,仍然会产生写入错误。
我是否可以这么说:如果返回值 frwrite 等于 nemmb,那么写入错误可能发生,也可能没有发生(或者我误解了7.23.8.2p3的表述)?如果是这样,当 nmemb 等于返回值时出现写入错误又意味着什么?
下面是一个示例,用来说明我的问题
#include <stdio.h>
#include <stdlib.h>
int main(void){
char msg[] = "hello";
size_t nmemb = sizeof msg - 1;
size_t num_written = fwrite(msg, sizeof *msg, nmemb, stdout);
if (num_written < nmemb)
//a write error has occured
return EXIT_FAILURE;
//is it possible that I could still have a write error
return ferror(stdout); //could this ever return `true`?. if so what does this mean
}
解决方案
这条规则的措辞暗示,可能在输出流中成功写入所有元素的同时,仍然会产生写入错误。
我理解你的困惑,但你理解得不对。就语境而言,你需要认识到规范是在告诉你如何识别在 fwrite 中发生错误。它从不(也从未)关心任何与C 的抽象语义脱离的底层实现相关错误。在这个层面,写入的所有项就被视为成功,因此,在相关意义上,不可能在所有元素都已成功写入的情况下发生写入错误(在相关意义上亦然)。
也有可能 fwrite() 成功,但输出从未到达最终目的地,例如持久化的文件或I/O设备。导致这种情况的系统错误可能导致 fwrite() 报告写入错误(以短写入的形式),但它们并不一定会这样做。它们也可能表现为在随后的I/O函数调用,或其他函数的调用中出现错误,或者在某些情况下,可能根本不向程序报告。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。