0

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

4

2 回答 2

1

你可以做的几件事:

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

  2. 打印model_->nr_class以确保值的数量是您所期望的

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

希望这可以帮助

于 2012-06-18T15:50:10.270 回答
0

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

于 2014-11-30T18:29:01.123 回答