通过相应标准 I/O 流的输入/输出是否会失败?

标签 c file-io c99

fgetsfputs 等标准输入/输出函数可能会因相应的读取或写入错误而失败。这是有道理的,因为文件系统权限和空间限制可能会阻止程序读取或写入文件。

但是,我很难想象在相应的标准 I/O 流(stdinstdoutstderr) 会失败,因为它们在概念上看起来比文件系统中的典型文件更抽象。

例如,下面的 fputs 调用是否可能返回表示写入错误的 EOF

fputs("Hello world!\n", stdout)

C99 标准是否明确或隐含地保证在各个标准 I/O 流上成功进行输入/输出操作?还是合规的理论实现可能会失败?

我怀疑标准 I/O 流上可能存在错误,因为 puts 函数和 gets 函数 Returns 部分都提到了失败返回值; putsgets 显式分别写入/读取 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/

相关文章:

C 编程 - 访问 USB 数据/驱动程序细节

c gobjects.h 通过变量将颜色值传递给 setColor

c - 在64位机器上处理文件但在32位机器上开发

c - 断言可变长度数组的分配

c - 为什么 sizeof(x)++ 编译?

c - 零大小的 memblocks 有什么用?

正确的 strtod 实现?

c - libcurl C API > POST 从 URL 获取的数据范围

windows - 通过 GUID 打开设备

matlab - 为什么 MATLAB 无法成功读取二进制文件?