0

我有一个 C 程序试图记录一种叫做“雪崩大小”的东西。记录的标准是如果程序生成的“delta_energy”小于等于零,那么我可以将雪崩大小增加“*avalanche_size = *avalanche_size + 1;” 如果 delta_energy 不小于零,那么它会继续运行循环而不增加雪崩大小。

所以我想做的是在雪崩大小增加时(不是其他情况)将增量能量写入一个名为 delta_energies_GSA 的文件,如下面的代码所示。

但我发现发生的是,如果我将 fprintf 语句放在 if{ } 中,其中雪崩大小肯定会增加,每次它进行一次迭代时,它都会覆盖文件中的所有条目。所以最后我得到的文件只包含其中一次迭代的增量能量。如果我将 fprintf statemenet 放在括号外,它会记录所有内容,但它也会在雪崩大小未增加且我不想要这些时为我提供增量能量。

我想过做一个条件,比如“如果雪崩大小大于之前的雪崩大小,那么 fprintf delta 能量”......但我不确定如何做到这一点,因为雪崩大小只是一个整数而不是一个向量。 .

任何帮助将非常感激!谢谢

for (k = 0; k < n_nodes; k++)
     {
       if (delta_energy <= 0.0)
        {
            stored_state[i] = new_state;
            *avalanche_size = *avalanche_size + 1;
            printf("\n\n For k = %d: ",k);
            printf("\n\n This is the delta energy with GSA for %d avalanche size:%f", *avalanche_size, delta_energy);

            fprintf(delta_energies_GSA,"\n %d\t %d\t %f \n",k, *avalanche_size, delta_energy);

        }

我没有展示完整的代码,因为它是一个非常大的程序的一个非常大的函数。我在打开和关闭文件时也非常小心。在我声明变量后,该文件在函数的开头打开。我在函数结束之前关闭了文件。

这是打开文件的方式:

{
    double  d_energy, q_A_minus_1, one_over_q_A_minus_1, prob_term;
    neighbor_inf    *np;

extern  int generate_new_state();

FILE *delta_energies_GSA;


delta_energies_GSA = fopen("delta_energies_GSA.dat", "w");
if (delta_energies_GSA == NULL) 
{
    printf("I couldn't open delta_energies_GSA.dat for writing.\n");
    exit(0);
}

在声明我的变量之后,它在函数结束之前关闭:

    fclose(delta_energies_GSA);
return(stored_state);

}    /* end recover_stored_patterns_GSA() */
4

1 回答 1

1

fprintf()完全符合您的要求,将字符串附加到文件中,如果fopen()在for 循环之外(在这种情况下,请使用“w+”和 fopen , 对于追加) 并且没有寻求0。

编辑 我的错误,不是“w+”而是“a”用于追加(如果您不需要也阅读文件)。

您必须调查的错误行为是“为什么 fprintf 替换整个文件”。试试这个简单的测试。

#include <stdio.h>

int main(int argc, char **argv) {
    FILE *f = fopen("test", "w");
    if (f) {
            int i;
            for (i=0; i<100; i++) {
                    if (i % 3)
                            fprintf(f, "%d\n", i); 
            }
            fclose(f);
    }
    return 0;
}
于 2013-08-10T12:31:17.100 回答