0

「なだれサイズ」と呼ばれるものを記録しようとしている C プログラムがあります。これを記録する基準は、プログラムによって生成された「delta_energy」がゼロ以下の場合、「*avalanche_size = *avalanche_size + 1;」で雪崩のサイズを増やすことができます。delta_energy が 0 以上の場合、雪崩のサイズをインクリメントせずにループを実行し続けます。

したがって、私がやりたいことは、以下のコードに示すように、delta_energys_GSA というファイルに AVALANCHE SIZE IS INCREMENTED (そうでない場合) のデルタ エネルギーを書き込むことです。

しかし、私が見つけたのは、fprintfステートメントをif{}内に配置すると、なだれのサイズが確実に増加すると、1回の反復を行うたびに、ファイル内のすべてのエントリが上書きされることです。したがって、最終的には、反復の 1 つのデルタ エネルギーのみを含むファイルになります。fprintf ステートメネットをブラケットの外に置くと、すべてが記録されますが、雪崩のサイズが増加せず、それらが必要ない場合のデルタ エネルギーも得られます。

「雪崩のサイズが以前の雪崩のサイズよりも大きい場合、デルタエネルギーを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() */
4

1 に答える 1

1

fprintf()はあなたがやりたいことを正確に行い、文字列をファイルに追加します。 fopen()が for ループの外側にある場合、コードに問題はありません(この場合、fopen で "w+" を使用します) 、追加用) であり、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 に答える