2

私がやりたいこと: 1 つのファイル (入力ファイル) からビットを読み取り、これらの (ある程度の確率で) 反転されたビットを他のファイル (出力ファイル) に書き込みます。

問題は何ですか: 確率のアイデアが正しく機能していないようです。さらに重要なことに、出力ファイルには常に元の入力ファイルよりも多くの文字が含まれていますが、同じ数の文字が含まれている必要があります。

このコード サンプルでは、​​反転ビットの代わりに 'x' と 'y' を入れたので、出力ファイルにより多くの文字が含まれていることがより明確になります。

入力ファイル: 01001

出力ファイル: xyxxxyx

コード:

void invert_bits(FILE **input, FILE **output, double prob){
srand(clock());
char symbol;
while((symbol = getc(*input)) != EOF){
    double result = rand()/RAND_MAX;
    if(result < prob){
        if(simbol == '0'){
            char bit = 'x';
            fprintf(*output, &bit);
        }
        else{
            char bit = 'y';
            fprintf(*output, &bit);
        }
    }else{
        fprintf(*output, &symbol);
    }
}

}

4

2 に答える 2

2

(f)printf2 番目の引数としてフォーマット文字列が必要です。char有効な文字列でさえないa のアドレスを指定しています (NUL で終了していないため)。

そうしないでください。それは悪い習慣です。を使用する場合printffprintfまたはsprintf 常に書式文字列を使用します。(詳細については、こちらをお読みください。)

使用することもできfprintf(*output, "%c", bit);ましたが、文字を印刷するだけの方がはるかに簡単ですfputc(bit, *output);

FILE*ちなみに、引数をポインタとして渡す必要があると感じる理由がわかりません。

于 2013-10-27T15:22:50.337 に答える
1

fprintf機能を正しく使用していません。

関数のシグネチャは次のとおりです。

int fprintf ( FILE * ストリーム, const char *フォーマット, ... );

ヌルで終了する文字列の代わりに、ヌル文字が続く場合とそうでない場合がある のアドレスを指定してcharいます。

*printf 関数を使用して文字を印刷する正しい方法は次のとおりです。

fprintf(*output, "%c", bit);

FILE**PSだけでなく、ファイル ハンドルへのポインタを受け取っているのはなぜFILE*ですか?

于 2013-10-27T15:23:53.843 に答える