[英]Communicate with external C program with Java using stdin and stdout
[英]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 之前就应该没问题。
从调用getchar
或putchar
的不同 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.