ferror(stdin) / ferror(stdout) 的返回值是否受到我在函数中而不是在主函数中检查它们的影响?
的返回值ferror()是您作为参数提供的流的当前状态的特征。在任何给定时间,stdinprovided bystdio.h指的是每个函数中具有相同状态的相同流,包括main(). ferror()因此,通过中间函数间接调用函数将获得与直接调用相同的结果。
尽管如此,您在示例中提出的方法很差。在大多数情况下,C 标准库函数通过它们的返回值指示是否发生了错误。特别是,如果遇到文件末尾或发生错误,则getchar()返回由宏表示的特殊值。这是典型的 stdio 函数。您应该始终如一地测试函数的返回值,以识别何时发生了异常情况。对于流函数,你应该只在检测到这种情况之后调用和/或,并且只有当你想区分文件结束情况和 I/O 错误情况(以及某些函数的“两者都不是”情况) . 另请参阅“为什么 'while (!feof (file))' 总是错误的?”EOFferror()feof()
就个人而言,我可能根本不会编写像您这样的通用函数streamCheck(),因为错误处理通常是特定于情况的。但是,如果我确实写了一个,那么我肯定会让它只测试我指定给它的一个流。像这样的东西,例如:
void streamCheck(FILE *stream, const char *message, int exit_code) {
if (ferror(stream)) {
fputs(message, stderr);
exit(exit_code);
}
}
int main(void) {
int c = getchar();
if (c == EOF) {
streamCheck(stdin, "stdin err\n", 1);
}
// ...
if (putchar(c) == EOF) {
streamCheck("stdout err\n", 2);
}
}