C中stdin与EOF的关系

问题描述

C测验有关于fprintf和EOF的这四个问题。在课程中与这些问题相关的部分并没有对它们进行真正的解释,我无法在线找到适合他们的好答案。

是屏幕打印和/或编译中的数字未能通过fprintf的结果或与EOF的关系的原因吗?

#include <stdio.h> 

int main(void) { 
    int i; 
    i = fprintf(stdin,"Hello!"); 
    printf("%d",i == EOF); 
    return 0; 
} 

答案:程序输出1

#include <stdio.h> 

int main(void) { 
    int i; 
    i = fprintf(stderr,i == EOF); 
    return 0; 
}

答案:程序向标准输出输出0

#include <stdio.h> 

int main(void) { 
    FILE *f; 
    int i = fprintf(f,i == EOF); 
    return 0; 
}

答案:编译或执行失败

#include <stdio.h> 

int main(void) { 
    FILE *f = fopen("file","w"); 
    int i = fprintf(f,i != EOF); 
    return 0; 
}

答案:程序输出1

解决方法

EOF是一个通常等于-1的宏。

  1. 第一季度:
    • // router.js router.post('/v1/something-protected',requireAuth,checkRole('commercial'),(req,res) => { // do what you want... }) 是输入流。因此,在其上使用fprintf会产生冲突,显然由stdin处理并返回-1。 (如注释中所述,如果发生错误,则返回值可以是任何负数)。
    • 从这种意义上说,条件fprintf()返回的真值为1,这说明了答案。
  2. 第二季度:
    • (i == EOF)是输出流,这意味着成功打印到其中
    • stderri = ...包含写入的字符数。 > 0
    • i的值为0。
    • 0被打印
  3. 第三季度:
    • i == EOF尝试打印到地址为fprintf的流中
    • f是带有垃圾值的指针,这意味着它可能指向操作系统拥有的内存。
    • 对该地址的写操作导致编译或执行失败
  4. 第四季度:
    • f完成工作并将5个字符写入文件fprintf
    • f初始化为值5
    • i的计算结果为i != EOF,这是正确的,将其作为数字1存储在内存中。
    • 打印的值为1