fwrite在C中将错误指示器放入流

fwrite在C中将错误指示器放入流,c,C,在什么情况下,函数fwrite会在流上放置一个错误指示符,以便ferror返回true 具体来说,我想知道当所有字节都没有成功写入时,它是否会出错 请提供一个链接,说明您从何处获取信息 感谢您从我的Linux系统上的fwrite手册页: RETURN VALUE fread() and fwrite() return the number of items successfully read or written (i.e., not the number of characters

在什么情况下,函数fwrite会在流上放置一个错误指示符,以便ferror返回true

具体来说,我想知道当所有字节都没有成功写入时,它是否会出错

请提供一个链接,说明您从何处获取信息


感谢您

从我的Linux系统上的fwrite手册页:

RETURN VALUE
   fread() and fwrite() return the number of items successfully read or written
   (i.e., not the number of characters).  If an error occurs, or the end-of-file
   is  reached, the return value is a short item count (or zero).

   fread()  does  not  distinguish between end-of-file and error, and callers
   must use feof(3) and ferror(3) to determine which occurred.

仅从阅读手册页来看,它看起来不会设置
errno

如果发生任何错误,将设置流的错误指示器,并且在调用
clearerr
之前不会清除。但是,由于缓冲,stdio函数很难报告错误。通常,在以后的调用之前不会看到错误,因为缓冲数据从未失败,但缓冲区满后的后续写入可能会失败。如果您使用stdio编写文件,我知道的唯一可靠处理写入错误的方法是(选择一种):

  • 禁用缓冲(使用
    setbuf
    setvbuf
    -这必须是在
    文件打开后对其执行的第一个操作,否则将无法执行)
  • 跟踪最后一次成功的
    fflush
    ,并假设之后的任何数据可能只被部分写入
  • 将任何失败的写入操作视为完全不可恢复的文件,然后将其删除

还请注意,在POSIX系统上,如果发生错误,则需要设置
errno
(和其他stdio函数)以指示错误类型。就普通C而言,这些函数可以设置
errno
,也可以不设置。

在Windows上
fwrite
尝试写入读取打开的流时可能会出错


例如,如果有对
seekg
的调用,该调用将读取标志设置为流,并且在写入之前未调用
seekp

您在说什么?fwrite()返回大小,而不是布尔值。您似乎与 <代码> C++的头文件混淆了。您使用的是哪种编译器?什么操作系统?@Hans:
fwrite
返回
size\u t
ferror
返回类型为
int
的布尔值。您的结论是错误的。在Linux(其目的是符合POSIX)上,
fwrite
必须在失败时设置
errno
。R,您能提供一些说明文件吗?我需要试着向某人指出一点。R,如果我随后多次调用fwrite,那么检查ferror在最后是否为真就足够了吗?
fwrite
是根据
fputc
定义的,其规范针对错误引用了
fputc
fputc
的规范(在POSIX中)在这里:是的,一旦为流设置了错误指示符,它将是永久的,直到您在流上调用
clearr
。因此,在最后检查ferror并忽略它是完全可以接受的。