C中stdin和EOF的关系

Relation of stdin and EOF in C

C 测验有这四个问题,涉及 fprintf 和 EOF。在与这些问题相关的课程部分中并没有真正解释它们,我无法在网上找到好的答案。

屏幕打印数字的原因and/or编译失败是fprintf的结果还是与EOF的关系?

#include <stdio.h> 

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

Answer: the program outputs 1

#include <stdio.h> 

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

Answer: the program outputs 0 to the stdout stream

#include <stdio.h> 

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

Answer: the compilation or execution fails

#include <stdio.h> 

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

Answer: the program outputs 1

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

  1. Q1 :
    • stdin 是一个输入流。因此,在其上使用 fprintf 会产生冲突,这显然是由 fprintf() 和 returned -1 处理的。 (如评论中所述,出现错误时的 return 值可以是任何负数)。
    • 从这个意义上说,条件 (i == EOF) return 为真,即 1。这解释了答案。
  2. Q2 :
    • stderr 是一个输出流,意味着打印到它是成功的
    • i = ...,i包含写入的字符数。 >0
    • i == EOF 的计算结果为 0。
    • 0 已打印
  3. Q3 :
    • fprintf 尝试打印到地址为 f
    • 的流中
    • f 是一个带有垃圾值的指针,这意味着它可能指向 OS.
    • 拥有的内存
    • 对该地址的写入导致编译或执行失败
  4. 第四季度:
    • fprintf 完成它的工作并将 5 个字符写入文件 f
    • i 初始化为值 5
    • i != EOF 计算结果为 5 != -1,为真,在内存中存储为数字 1
    • 打印值为 1