C Ferror是否进行多次写入?

C Ferror是否进行多次写入?,c,printf,runtime-error,ferror,C,Printf,Runtime Error,Ferror,本例中的ferror是同时检查fprintfs是否存在错误,还是仅检查第二个错误 FILE * myout; if ((myout = fopen("Assignment 11.txt", "a")) != NULL) { fprintf(myout, "First print ", str1); fprintf(myout, "Second print", str1); if (ferror(myout)) fprintf(stderr, "Err

本例中的
ferror
是同时检查
fprintf
s是否存在错误,还是仅检查第二个错误

FILE * myout;
if ((myout = fopen("Assignment 11.txt", "a")) != NULL)
{
    fprintf(myout, "First print ", str1);  
    fprintf(myout, "Second print", str1);

    if (ferror(myout))
        fprintf(stderr, "Error printing to file!");

    fclose(myout);
}

如果发生错误,除非在流上调用
clearerr
,否则不会重置该错误,因此是的,两次写入中的任何一次都会记录错误

发件人:

函数ferror()测试流指向的流的错误指示器,如果设置了,则返回非零。错误指示器只能通过clearerr()函数重置

但您也可以简单地使用
fprintf
返回代码来查看是否出现问题:

如果遇到输出错误,则返回负值

()

像这样(感谢Jonathan指出原始帖子中的错误):


if(fprintf(myout,“First print%s\n”,str1)我想您应该在每次写入后检查,以便准确地知道错误发生的时间。@Michael是的,也许,在一个完美的世界中:)但目前,我正在相邻打印两次;基本上是同一行文本的两部分。我真的不在乎是谁出错,我只需要知道是否发生了任何错误。你能验证这是标准的C行为吗?不是Linux特有的吗?请参阅POSIX:和。或者在网上找到C标准,但是POSIX不会违背C标准,因为它可以避免。@JonathanLeffler:POSIX比C标准更可读/更易访问,对于标准C函数和头,超出ISO C要求的POSIX要求通常用“CX”进行“着色”(标记)该Linux手册页声称“错误指示器只能由clearerr()函数重置”是错误的,因为至少也会清除它。该手册页还声称,文件结尾指示符只能由clearerr()重置,这一点更加错误,因为即使是fseek()也会清除该指示符。C和POSIX标准似乎不能保证其他函数不会重置错误指示器,我也不信任Linux手册页,因为它们甚至内部都不一致。
if (fprintf(myout, "First print %s\n", str1)<0) fprintf(stderr, "Error printing to file #1!");
if (fprintf(myout, "Second print %s\n", str1)<0) fprintf(stderr, "Error printing to file #2!");