fwrite在C中将错误指示器放入流
在什么情况下,函数fwrite会在流上放置一个错误指示符,以便ferror返回true 具体来说,我想知道当所有字节都没有成功写入时,它是否会出错 请提供一个链接,说明您从何处获取信息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
感谢您从我的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()返回大小,而不是布尔值。您似乎与fwrite
返回size\u t
但ferror
返回类型为int
的布尔值。您的结论是错误的。在Linux(其目的是符合POSIX)上,fwrite
必须在失败时设置errno
。R,您能提供一些说明文件吗?我需要试着向某人指出一点。R,如果我随后多次调用fwrite,那么检查ferror在最后是否为真就足够了吗?fwrite
是根据fputc
定义的,其规范针对错误引用了fputc
fputc
的规范(在POSIX中)在这里:是的,一旦为流设置了错误指示符,它将是永久的,直到您在流上调用clearr
。因此,在最后检查ferror并忽略它是完全可以接受的。