【问题标题】:How to find the fprintf() actual error?如何找到 fprintf() 实际错误?
【发布时间】:2011-04-20 07:00:56
【问题描述】:

在我的程序中,fprintf() 返回 -1,表示错误。我怎样才能找出实际的错误是什么?

【问题讨论】:

  • 第 42 行第 36 个字符。
  • 只是为了解释@AProgrammer 具有讽刺意味(和有趣)的答案:当您提出与您的代码相关的问题时,发布您的问题的实际代码。我们显然无法猜出您输入的内容。
  • @ereOn:这并不讽刺。实际错误的正确答案确实是 42。我还在摸不着头脑,想弄明白 36 代表什么:)
  • 36 是小于 42 的最大正方形;-)
  • @AProgrammer:现在说得通了。干杯! :)

标签: c++ c file file-io


【解决方案1】:
#include <errno.h>
#include <string.h>

...
rc = fprintf(...)
if (rc < 0) 
    printf("errno=%d, err_msg=\"%s\"\n", errno,strerror(errno))

【讨论】:

  • 你不应该自己声明errno,只需包含&lt;errno.h&gt;;它可能是一个宏,而不是一个变量。
  • 点了。 libc 操作系统依赖。我认为在较旧的 linux libcs​​ 上,您必须在外部声明它。已更正。
  • Err,adirau,这甚至更更糟糕。 #ifndef 仅适用于预处理器宏,而不适用于变量。你最好放弃整个#ifdef 块,因为ISO 要求errno.h 定义一个errno“变量”。我为你修好了,希望你不要介意。
  • 但是 errno 是一个预处理器宏,至少在 unix 和 linux 上是这样的 :)
  • errno 可能类似于#define errno (*__get_thread_local_errno_ptr()),但也可能只是extern int errno;。你不知道。始终使用errno.h
【解决方案2】:

您需要检查errno 的值。大多数库函数会将其设置为特定的错误代码,您可以在errno.h 中查找它,也可以使用perrorstrerror 来获取用户可读的版本。

例如:

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main (void) {
    FILE *fh = fopen ("junk", "w");
    if (fh != NULL) {
        if (fprintf (fh, "%s", "hello") < 0)
            fprintf (stderr, "err=%d: %s\n", errno, strerror (errno));
        fclose (fh);
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多