C 语言中 stdin 和 EOF 的关系

Relation of stdin and EOF in C

提问人:Onederfoo 提问时间:10/2/2020 最后编辑:John KugelmanOnederfoo 更新时间:10/2/2020 访问量:386

问:

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,"Hello!"); 
    printf("%d",i == EOF); 
    return 0; 
}

答:程序将 0 输出到 stdout 流

#include <stdio.h> 

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

答:编译或执行失败

#include <stdio.h> 

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

答:程序输出 1

C printf stdin fopen eof

评论

3赞 Barmar 10/2/2020
这些结果都不是由语言指定的。 只需要是负值,但可以是任何负数。同样,当它出现错误时返回负数,但它也可以是任何负数。不要求这些负数相同。EOFfprintf()
3赞 Barmar 10/2/2020
第三种会导致未定义的行为。你从未初始化过,所以你不能用它作为 的参数。ffprintf()
0赞 Onederfoo 10/2/2020
@Barmar我明白了。为什么 i = fprintf(stdin,“你好!”);返回否定?
3赞 Barmar 10/2/2020
stdin仅对读取开放,无法写入,因此会出现错误。
1赞 10/2/2020
@Onederfoo“stdin 只对阅读开放”,虽然大多数时候都是如此,但事实并非如此。

答:

2赞 Pixel_teK 10/2/2020 #1

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

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

评论

1赞 Onederfoo 10/2/2020
这是一个很好的信息,完全回答了我的问题。谢谢