我想做什么: 从一个文件(输入文件)中读取位,并将这些(有一些概率)反转位写入其他文件(输出文件)。
有什么问题: 概率想法似乎没有正常运作。更重要的是,输出文件总是包含比原始输入文件更多的字符,而它们应该包含相同数量的字符。
在这个代码示例中,我没有使用反转位来放置'x'和'y',因此输出文件包含更多字符更明显
INPUT文件:01001
OUTPUT文件: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);
}
}
}
答案 0 :(得分:2)
(f)printf
期望 format 字符串作为其第二个参数。您正在为其提供char
的地址,该地址甚至不是有效的字符串(因为它不是以NUL终止的)。
不要那样做。这是一个坏习惯。当您使用printf
时,fprintf
或sprintf
始终使用格式字符串。 (有关详细信息,请阅读this。)
您可以使用fprintf(*output, "%c", bit);
,但使用fputc(bit, *output);
打印字符会更简单
顺便说一下,我不明白为什么你认为需要将FILE*
参数作为指针传递。
答案 1 :(得分:1)
您没有正确使用fprintf
功能。
该函数的签名是:
int fprintf(FILE * stream,const char * format ,...);
而不是以空字符结尾的字符串,而是为其提供char
的地址,该地址可能后跟空字符,或者可能不会。
使用* printf函数打印字符的正确方法是:
fprintf(*output, "%c", bit);
P.S。为什么你收到一个指向文件句柄的指针,即FILE**
而不只是FILE*
?