我有一个C程序,它试图记录一个叫做“雪崩大小”的东西。记录这一点的标准是,如果程序生成的" delta_energy“小于零,那么我可以将雪崩大小增加"*avalanche_size = *avalanche_size +1”;如果delta_energy不小于零,则继续运行循环而不增加雪崩大小。
因此,我想要做的是,当雪崩的大小增加(而不是其他情况)时,将增量能量写入一个名为delta_energies_GSA的文件,如下面的代码所示。
但我发现,如果我将fprintf语句放在if{ }中,雪崩大小肯定会增加,那么每次迭代时,它都会重写文件中的所有条目。最后,我得到了一个文件,它只包含了其中一个迭代的增量能量。如果我把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() */
发布于 2013-08-10 12:31:17
fprintf()完成了您想要做的事情,将一个字符串附加到文件中,如果fopen()在循环之外(在本例中使用"w+“与fopen,用于追加),并且不寻求0,那么在这里没有发现代码有什么问题。
编辑 My错误,不是"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;
}
https://stackoverflow.com/questions/18161657
复制相似问题