C:同时读取和写入文件

时间:2013-10-27 15:16:42

标签: c file-io

我想做什么: 从一个文件(输入文件)中读取位,并将这些(有一些概率)反转位写入其他文件(输出文件)。

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

在这个代码示例中,我没有使用反转位来放置'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);
    }
}

}

2 个答案:

答案 0 :(得分:2)

(f)printf期望 format 字符串作为其第二个参数。您正在为其提供char的地址,该地址甚至不是有效的字符串(因为它不是以NUL终止的)。

不要那样做。这是一个坏习惯。当您使用printf时,fprintfsprintf 始终使用格式字符串。 (有关详细信息,请阅读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*