问我想检查一下errno在一长串printf调用之后,看看它们是否有失败的。
errno = 0; printf("This\n"); printf("is\n"); printf("a\n"); printf("test.\n"); if(errno != 0) fprintf(stderr, "printf failed: %s\n", strerror(errno));当我将输出重定向到文件时,为什么它会打印出像“printf failed: Not a typewriter”(printf 失败:不是打字机)这样的奇怪信息?
答许多 stdio 包的实现会根据其行为稍作调整,如果stdout是终端的话。为了做出判断,这些实现会执行一些操作,而这些操作在stdout不是终端时会失败(错误代码为 ENOTTY)。尽管输出操作最终会成功完成,errno仍然包含 ENOTTY。这种行为可能有些令人困惑,但并非严格错误,因为它仅对程序在有错误报告后检查errno的内容才有意义。(更准确地说,errno只有在设置了errno的库函数返回错误代码后才有意义。)
总的来说,最好通过检查函数的返回值来检测错误。要检查一长串 stdio 调用后累积的任何错误,您可以使用ferror。另请参阅问题 12.2 和 20.4。
参考文献:ISO Sec. 7.1.4, Sec. 7.9.10.3
CT&P Sec. 5.4 p. 73
PCS Sec. 14 p. 254