fgets
和 fputs
等标准输入/输出函数可能会因相应的读取或写入错误而失败。这是有道理的,因为文件系统权限和空间限制可能会阻止程序读取或写入文件。
但是,我很难想象在相应的标准 I/O 流(stdin
、stdout
、stderr
) 会失败,因为它们在概念上看起来比文件系统中的典型文件更抽象。
例如,下面的 fputs
调用是否可能返回表示写入错误的 EOF
?
fputs("Hello world!\n", stdout)
C99 标准是否明确或隐含地保证在各个标准 I/O 流上成功进行输入/输出操作?还是合规的理论实现可能会失败?
我怀疑标准 I/O 流上可能存在错误,因为 puts
函数和 gets
函数 Returns 部分都提到了失败返回值; puts
和 gets
显式分别写入/读取 stdout
/stdin
流,标准 I/上的错误O 流似乎是隐式的。
但是,这同样适用于 stderr
流吗?可能不是,因为 perror
函数没有提到错误条件,也没有返回表示失败的值(perror
有一个 void
返回类型)。
最佳答案
保证标准 IO 流存在。它们不能保证在 IO 操作时打开。作为一个进程通常从其父进程(无论是 shell 还是其他任何东西)继承其 IO 流,它们可以处于绝对任何状态:直接到控制台/键盘,重定向到/从文件或管道或套接字,或者......关闭.
所以是的,即使在标准流上,您也可能在任何 IO 操作上出错,无论是在输入(关闭)还是输出(设备上没有更多空间,...)
编辑:
您提到了 perror
的一个特例,它有一个 void 返回类型。这并不意味着 perror 不能失败:如果它被重定向,它可以。但是问题更多的是我可以在哪里写我不能写错误条件?!由于它已经在错误处理程序中,如果它不能写入 perror 的结果,通常程序不能做得更好:-(
关于通过相应标准 I/O 流的输入/输出是否会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26974244/