2013-10-27 4 views
2

Что бы я хотел: Чтение битов из одного файла (входного файла) и запись этих (с некоторой вероятностью) инвертированных битов в другой файл (выходной файл).C: одновременное чтение и запись в файл

Какая проблема: Вероятностная идея кажется неработоспособной. И что более важно, выходной файл всегда содержит больше символов, чем исходный входной файл, в то время как они должны содержать одинаковое количество символов.

В этом примере коды, вместо инвертированных бит я поставившие «х» и «у», так что это более очевидно, что выходной файл содержит больше символов

входного файла: 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); 
    } 
} 

}

+0

Вы уверены, что это правильно?Вы можете проверить, просмотрев временную метку файла или переименовав файл, но не меняя программу. –

+0

Передача адреса 'char' в качестве параметра формата в' printf' почти наверняка неверна. Вероятно, происходит то, что локальная переменная с 'y' находится в памяти до локальной переменной с' x', и за ними следуют '\ 0', поэтому в любое время вы пытаетесь напечатать' y' you print' yx вместо этого. – millimoose

+0

Вы не можете «записывать биты» - только байты. –

ответ

1

Вы не используете функцию fprintf правильно.

подпись функция заключается в следующем:

INT fprintf (FILE * поток, Const символ * формат, ...);

Вместо оканчивающегося нуля строки, вы предоставляете его с адресом char, который может последовать пустой символ, или не может.

Правильный способ печати символа с * PRINTF функций:

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

P.S. Почему вы получаете указатель на дескриптор файла, то есть FILE**, а не только FILE*?

2

(f)printf ожидает формат строку в качестве второго аргумента. Вы предоставляете ему адрес char, который даже не является допустимой строкой (поскольку она не завершена NUL).

Не делайте этого. Это плохая привычка. Когда вы используете printf, fprintf или sprintfвсегда используйте строку формата. (Читать для получения дополнительной информации.)

Вы могли бы использовать fprintf(*output, "%c", bit);, но это было бы намного проще просто напечатать символ с fputc(bit, *output);

Я не понимаю, почему вы чувствуете необходимость передавать FILE* аргументы как указатели, кстати.

Смежные вопросы