我有一个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() */
答案 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;
}