2

我想做的事情: 从一个文件(输入文件)读取位,并将这些(有一定概率)反转位写入另一个文件(输出文件)。

问题是什么: 概率概念似乎无法正常工作。更重要的是,输出文件总是包含比原始输入文件更多的字符,而它们应该包含相同数量的字符。

在此代码示例中,我放置了“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)printf期望格式字符串作为其第二个参数。您为它提供了 a 的地址char,它甚至不是一个有效的字符串(因为它不是以 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);

PS为什么你会收到一个指向文件句柄的指针,FILE**而不是只是FILE*

于 2013-10-27T15:23:53.843 回答