C程序在if语句中覆盖文件内容

时间:2013-08-10 12:02:18

标签: c if-statement file-io for-loop scientific-computing

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

所以我想做的是在将AVALANCHE尺寸增加(否则)时将增量能量写入名为delta_energies_GSA的文件,如下面的代码所示。

但我发现的事情是,如果我将fprintf语句放在if {}中,其中雪崩大小肯定会增加,每次进行一次迭代时,它会覆盖文件中的所有条目。所以最后我得到的文件只包含其中一个迭代的delta能量。如果我采用fprintf状态网并将其放在括号外,它会记录所有内容,但它也为我提供了三角形能量,以便在雪崩大小不增加且我不想要那些时。

我想要做的可能是“如果雪崩大小比之前的雪崩大小更大,然后再增加三角洲能量”......但是我不知道如何做到这一点,因为雪崩大小只是一个整数而不是矢量..

任何帮助都会非常感激!谢谢

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() */

1 个答案:

答案 0 :(得分:1)

fprintf()完全按照您要执行的操作,字符串附加到文件中,我在这里看不到任何错误如果 fopen()在for循环之外(在这种情况下使用“w +”和fopen,for append)并且不需要到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;
}