0

范围是否会影响,在从标准输入获取输入或输出到标准输出时检查错误?例如,如果我有一个按以下方式构建的代码体:

void streamCheck(){
   if (ferror(stdin)){
      fprintf(stderr, "stdin err");
      exit(1);
   }
   if (ferror(stdout)){
      fprintf(stderr, "stdout err");
      exit(2);
   }
}

int main(){
   int c = getchar();
   streamCheck();
   ...
   putchar(c) 
   streamCheck();
}

ferror(stdin) / ferror(stdout) 的返回值是否受到我在函数中而不是在主函数中检查它们的影响?如果有更好的方法来做到这一点也让我知道我对 C 很陌生。

4

3 回答 3

2

只要您ferror在调用该流上的任何其他函数之前调用该特定流,就可以了。

ferror从另一个函数调用getchar或被调用的函数并不重要putchar

于 2020-05-13T02:37:21.283 回答
1

你的功能没有问题。检查作为参数传递ferror()的那个的错误指示符。FILE *换句话说,错误指示符是文件对象的一个​​属性,可以直接从FILE *指针获得。因此,无论您ferror()从哪里调用,它都能够确定FILE *作为参数传递的 that 是否发生错误(也就是说,当然,参数是否有效)。

于 2020-05-13T02:42:29.900 回答
0

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);
   }
}
于 2020-05-13T03:15:40.617 回答