繁体   English   中英

使用外部 function 检查标准输入和标准输出

[英]Checking stdin and stdout using external function

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

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) 的返回值是否受到我在 function 而不是主要检查它们的影响? 如果有更好的方法可以让我知道我对 C 很陌生。

只要您在特定 stream 上调用ferror之前在该 stream 上调用任何其他 function 之前就应该没问题。

从调用getcharputchar的不同 function 调用ferror并不重要。

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

ferror(stdin) / ferror(stdout) 的返回值是否受到我在 function 而不是主要检查它们的影响?

ferror()的返回值是您作为参数提供的 stream 的当前 state 的特征。 在任何给定时间, stdio.h提供的stdin在每个 function 中引用相同的 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ,具有相同的 state,包括main() 因此,您将通过中介 function 间接调用ferror() function 获得相同的结果,就像直接调用它一样。

尽管如此,您在示例中提出的方法很差。 在大多数情况下,C 标准库函数通过其返回值指示是否发生错误。 特别是,如果遇到文件末尾发生错误, getchar()将返回一个特殊值,由宏EOF表示。 这是典型的 stdio 函数。 您应该始终如一地测试函数的返回值,以识别何时发生了异常情况。 对于 stream 函数,您应该仅在检测到此类情况后调用ferror()和/或feof() ,并且仅当您想要区分文件结束情况和 I/O 错误情况(以及“两者都不" 某些功能的情况)。 另请参阅“为什么 'while (?feof (file) )' 总是错误的?”

就个人而言,我可能根本不会编写通用的 function,例如您的streamCheck() ,因为错误处理通常是特定情况的。 但如果我确实写了一个,那么我肯定会让它只测试一个我指定给它的 stream。 像这样的东西,例如:

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);
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM