使用读取模式打开的流的fputc()行为

时间:2015-11-24 08:35:17

标签: c language-lawyer fopen undefined-behavior stdio

使用fputc()创建流时,我无法找到对fopen("/some/path", "r")的指定行为的任何引用。

我已经搜索了C11 Draft n1570 pdf寻找没有运气的任何参考,fopen()函数规范讨论了将未知字符作为模式参数传递,这是未定义的行为。但它并没有对创建的流上的后续IO做任何说明。

这是fwrite()函数规范

  

7.21.8.2 fwrite功能

     

概要

     
      
  1. #include <stdio.h>
    size_t fwrite(const void * restrict ptr,
        size_t size, size_t nmemb, FILE * restrict stream);
    
  2.         

    描述

         
        
    1. fwrite函数从ptr指向的数组写入由nmemb指定的size元素到stream指向的流。 {1}}。对于每个对象,对fputc函数进行大小调用,从unsigned char数组中精确覆盖对象获取值(按顺序)。流的文件位置指示符(如果已定义)按成功写入的字符数提前。如果发生错误,则流的文件位置指示器的结果值是不确定的。
    2.         

      返回

           
          
      1. fwrite函数返回成功写入的元素数,仅在遇到写入错误时才会小于nmemb。如果sizenmemb为零,则fwrite将返回零,并且流的状态保持不变。
      2.   

它将我们带到fputc()函数,所以

  

7.21.7.3 fputc功能

     

概要

     
      
  1. #include <stdio.h>
    int fputc(int c, FILE *stream);
    
  2.         

    描述

         
        
    1. fputc函数将c指定的字符(转换为unsigned char)写入stream指向的输出流,位于关联指示的位置流的文件位置指示器(如果已定义),并适当地推进指示器。如果文件不支持定位请求,或者使用追加模式打开流,则该字符将附加到输出流。
    2.         

      返回

           
          
      1. fputc函数返回写入的字符。如果发生写入错误,则会设置流的错误指示符,fputc将返回EOF
      2.   

正如您所看到的,对我所关注的情况没有任何解释。

1 个答案:

答案 0 :(得分:5)

这是未定义的行为,如果标准不是输出流,则标准不会定义行为。这是来自4符合性的部分(强调我的):

  

如果''''或''不应该''要求出现在约束或运行时约束之外   违反了,行为未定义。 否则是未定义的行为   在本国际标准中用“未定义的行为”,“强”或“强”来表示   省略任何明确的行为定义。重点之间没有区别   这三个;他们都描述了“未定义的行为”。

现在当然这并不妨碍实现进一步定义行为,我们可以看到POSIX fputc通过EBADF表示此错误:

  

[EBADF]

     
    

[CX] [Option Start]文件描述符基础流不是用于写入的有效文件描述符。

  

注意CX表示C标准的扩展名。