【问题标题】:In what scenarios would fprintf() not write to the output file在什么情况下 fprintf() 不会写入输出文件
【发布时间】:2012-06-18 15:43:42
【问题描述】:

这是我之前发布的一个更大问题的子问题。以下是我正在尝试使用的 C++ 包中的代码 sn-p。目的是将浮点数组 prob_estimates 中的值写入输出文件。对于一些看似随机的行,只写入了数组的部分值。什么时候会发生?我应该如何调试它?

    int j;
    predict_label = predict_probability(model_,x,prob_estimates);
    fprintf(output,"%g",predict_label);
    for(j=0;j<model_->nr_class;j++) {
        fprintf(output," %g",prob_estimates[j]);
        fflush(output);
    }
    fprintf(output,"\n");

我还想指出,这似乎仅在输入大小相当大时才会发生。这是一个更大的循环的一部分,它每行输入文件(大约 200,000 行)运行。 prob_estimates 数组每行有 500 个值。输出文件为输出文件中的 20 多行写入少于 500 个值。 我在一个子集(有 20,000 行)上运行了几次,一切似乎都很好。

更新:我尝试在每次尝试写入后检查 fprintf 的返回值,结果发现在尝试写入输出时,很多行都返回 -1。

fprintf encountered error at 19th value of line 2109359. Returned -1
fprintf encountered error at 373th value of line 2109359. Returned -1
fprintf encountered error at 229th value of line 2109360. Returned -1
fprintf encountered error at 87th value of line 2109361. Returned -1
fprintf encountered error at 439th value of line 2109361. Returned -1

这是我将上面的代码修改如下:

 for(j=0;j<model_->nr_class;j++) {
            int e = fprintf(output," %g",prob_estimates[j]);
            if (e < 0) {
            printf("fprintf encountered error at %dth value of line %d. Returned %d",j ,count ,e); }
        }

这里count是一个计算行数的变量。它在外部循环的顶部递增(此处未显示)。 我该怎么做才能弄清楚为什么 fprintf 返回 -1?

【问题讨论】:

  • 您是否尝试过创建最小的测试用例?从您的代码中不清楚输入/输出是什么。
  • model_-&gt;nr_class 对于那些看起来不正确的行是否可能有所不同?
  • 是总是一样的 20 行不打印,还是每次尝试后都会改变?
  • 这不是同一行。它甚至不是相同的行数。

标签: c++ printf


【解决方案1】:

你可以做的几件事:

  1. 将所有内容也打印到控制台,以查看问题是在文件输出中还是在其他地方

  2. 打印 model_-&gt;nr_class 以确保值的数量符合您的预期

  3. 仅在输出文件关闭后检查它。尽管您刷新了输出,但可能是其他地方更新了文件并且不刷新它。 fclose 会。我建议不要每行刷新文件,而是在函数开头以追加模式打开它,最后关闭它。

希望对你有帮助

【讨论】:

  • 我尝试检查 j 和 model_-> nr_class 的值,它们在每个循环结束时都是 499,即 if(j != model_-> nr_class) printf ("Something is wrong ") 没有在控制台上打印出任何内容。
  • 这是唯一写入此文件 AFAIK 的地方。处理整个输入文件时,最后会发生 fclose(output) 。我在每一行之后添加了 fflush() 只是为了确保每行的所有内容都写入文件。例如输出文件似乎只为第 n 行写入了 160 个值,而它之前和之后的行都正确写入了所有 500 个值。
  • '即if(j != model_-> nr_class) printf ("Something is wrong") 没有在控制台上打印出任何东西。 ' 明确地检查model_-&gt;nr_class != 499,当然你写的总是假的。
  • 如果不清楚我也尝试过,我很抱歉。 if (model_->nr_class != 499) 条件从未满足,我的输出文件仍然有 88 个值的行。
  • 那么将所有内容也打印到控制台怎么样,这是否也会为您提供更少值的行?
【解决方案2】:

现在你发现fprintf返回了一个错误,你需要在调用失败后检查errno的值来找出真正的错误原因是什么。

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 2021-05-02
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多