根据 fputs 自己的文档,是的,EOF 确实设置了 errno。手册页间接地推断出它,而不是直接说明它,希望能得到修改。函数 fputs 返回一个整数,成功时为正数,失败时为 EOF。所以错误处理 fputs 的关键是设置一个代码块,在 fputs 被调用时检查它的返回值。以下是我被教导如何处理 fputs 错误的 sn-p。
if (fputs(buffer, stdout) == EOF)
{
fprintf(stderr, "fputs returned EOF: %s\n", strerror(errno));
// .. and now do whatever cleanup you need to do.
// or be lazy and exit(-1)
}
这里我将缓冲区的内容写入标准输出并检查 fputs 是否返回 EOF。 EOF 表示设置了错误代码,因此只要您按照 fputs 手册页上的文档进行操作,您应该能够创建一堆 if 语句来检查 errno 可以设置的各种错误代码。
(1) 什么是缓冲区?我在别处声明的一些字符数组。
(2) fprintf 是做什么的?它将输出打印到传入的文件描述符,在这种情况下是标准错误(stderr ...它像标准输出一样打印到控制台,但是对于错误)。
(3) 什么是strerror?它是在 string.h 标头中定义的函数,用于打印传入错误代码的错误信息。它包含可以设置 errno 的每个错误代码的信息。头文件 string.h 不应与 strings.h 混淆,后者是一个不包含 strerror(3) 的 BSD linux 头文件。
编辑:好的,我搞砸了。您正在寻找有关 fgets 的答案,而不是 fputs。
要检查 fget 是否有错误,请执行以下操作
if (fgets(buffer, BUF_SIZE, myFile) == NULL)
{
// print out error as a string to stderr
fprintf(stderr, "fgets error occurred: %s\n", strerror(errno));
// do cleanup
}
// special: you also need to check errno AFTER the if statement...
问题是,您得到错误的唯一方法是如果流变得不可读,这可能是由于权限或试图读取处于写入模式的内容。在网络的情况下,可能会在阅读过程中切断您的连接,在这种情况下,您还需要检查 fgets if 语句之后的错误代码。但如果出现问题,它将设置错误代码。
至少在手册页正确的情况下是这样。有关更多详细信息,请参阅 linux 手册页。唯一可以设置的错误码是“我看不懂这个东西”的代码,也就是errno == EBADF