使用fputc()
创建流时,我无法找到对fopen("/some/path", "r")
的指定行为的任何引用。
我已经搜索了C11 Draft n1570 pdf寻找没有运气的任何参考,fopen()
函数规范讨论了将未知字符作为模式参数传递,这是未定义的行为。但它并没有对创建的流上的后续IO做任何说明。
这是fwrite()
函数规范
7.21.8.2
fwrite
功能概要
- 醇>
#include <stdio.h> size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
描述
- 醇>
fwrite
函数从ptr
指向的数组写入由nmemb
指定的size
元素到stream
指向的流。 {1}}。对于每个对象,对fputc
函数进行大小调用,从unsigned char
数组中精确覆盖对象获取值(按顺序)。流的文件位置指示符(如果已定义)按成功写入的字符数提前。如果发生错误,则流的文件位置指示器的结果值是不确定的。返回
- 醇>
fwrite
函数返回成功写入的元素数,仅在遇到写入错误时才会小于nmemb
。如果size
或nmemb
为零,则fwrite
将返回零,并且流的状态保持不变。
它将我们带到fputc()
函数,所以
7.21.7.3
fputc
功能概要
- 醇>
#include <stdio.h> int fputc(int c, FILE *stream);
描述
- 醇>
fputc
函数将c
指定的字符(转换为unsigned char
)写入stream
指向的输出流,位于关联指示的位置流的文件位置指示器(如果已定义),并适当地推进指示器。如果文件不支持定位请求,或者使用追加模式打开流,则该字符将附加到输出流。返回
- 醇>
fputc
函数返回写入的字符。如果发生写入错误,则会设置流的错误指示符,fputc
将返回EOF
。
正如您所看到的,对我所关注的情况没有任何解释。
答案 0 :(得分:5)
这是未定义的行为,如果标准不是输出流,则标准不会定义行为。这是来自4
符合性的部分(强调我的):
如果''''或''不应该''要求出现在约束或运行时约束之外 违反了,行为未定义。 否则是未定义的行为 在本国际标准中用“未定义的行为”,“强”或“强”来表示 省略任何明确的行为定义。重点之间没有区别 这三个;他们都描述了“未定义的行为”。
现在当然这并不妨碍实现进一步定义行为,我们可以看到POSIX fputc通过EBADF
表示此错误:
[EBADF]
[CX] [Option Start]文件描述符基础流不是用于写入的有效文件描述符。
注意CX
表示C标准的扩展名。