在什么情况下fprintf()不会写入输出文件

时间:2012-06-18 15:43:43

标签: c++ printf

这是我之前发布的更大问题的子问题。以下是我正在尝试使用的C ++包中的代码片段。目的是将float数组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?

2 个答案:

答案 0 :(得分:1)

你可以做的一些事情:

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

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

  3. 仅在关闭后检查输出文件。虽然您可以输出输出,但可能是其他地方更新文件而不是刷新它。 fclose会。我建议不要每行刷新文件,而是在函数开头的append模式下打开它,最后将它关闭。

  4. 希望这有帮助

答案 1 :(得分:0)

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