2013-11-20 4 views
0

Итак, я пытаюсь записать эту строку в текстовый файл;fprintf не записывает «%» в файл

sprintf(line, "%d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %d, %s\n", 
      gen_no, total_time, 
      progp->total_fitness, 
      progp->entopy_breakdown[0], 
      progp->entopy_breakdown[1], 
      progp->entopy_breakdown[2], 
      progp->entopy_breakdown[3], 
      progp->entopy_breakdown[4], 
      progp->entopy_breakdown[5], 
      progp->entopy_breakdown[6], 
      0, 
      tree_as_char); 

fprintf(fp, line); 
fclose(fp); 

Все в строке написано правильно, кроме когда tree_as_char имеет т.е. символы «%» «% 25» в нем (иногда пишет один, а затем идущее полукокс спасся, иногда does't написать любой). Все остальные символы в tree_as_char записываются в файл правильно, и печать строки правильно печатает символы%. Может быть, я никуда не уйду?

Спасибо!

Фил

+5

Подсказка: что означает окончательный 'f' в' sprintf' и 'fprintf'? –

+0

@Rhymoid Отформатирован? –

+0

@KVD: Да, или что-то в этом роде. OP форматирует строку дважды. –

ответ

4

fprintf будет относиться к любому % символа в качестве второго параметра в качестве форматтер. Попробуйте fprintf(fp, "%s", line);.

+0

^Это. Или просто убейте первый оператор 'sprintf()' и поместите все в один вызов 'fprintf()' –

3

О, дорогая, только что заметила, что вы пишете sprintf, и затем позвоните по номеру fprintf. Теперь это просто не нужно. Вы можете легко сэкономить на этом sprintf вызов написав:

fprintf(fp, "%d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %d, %s\n", 
      gen_no, total_time, 
      progp->total_fitness, 
      progp->entopy_breakdown[0], 
      progp->entopy_breakdown[1], 
      progp->entopy_breakdown[2], 
      progp->entopy_breakdown[3], 
      progp->entopy_breakdown[4], 
      progp->entopy_breakdown[5], 
      progp->entopy_breakdown[6], 
      0, 
      tree_as_char); 

Это должно работать, и вы не будете иметь больше проблем с процентами знаков в строке tree_as_char. Если вам все еще нужно, что line вар для других вещей, вы можете выбрать: разобрать строку, добавляя вторичные % символы перед записью указателя файла, используйте fwrite, или, лучше (возможно): использовать fputs:

sprintf(line, "%d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %d, %s\n", 
      gen_no, total_time, 
      progp->total_fitness, 
      progp->entopy_breakdown[0], 
      progp->entopy_breakdown[1], 
      progp->entopy_breakdown[2], 
      progp->entopy_breakdown[3], 
      progp->entopy_breakdown[4], 
      progp->entopy_breakdown[5], 
      progp->entopy_breakdown[6], 
      0, 
      tree_as_char); 
fputs(fp, line); 

Если вы хотите напечатать знак процента (%) с использованием любой из функций *printf, вам необходимо избежать самого знака процента. Просто напишите %%, чтобы получить одну%:

printf("%d%%", 10); 

напечатает 10%
Если ваш tree_as_char содержит знаки процента, fprintf просто считают, что в качестве заполнителя, поэтому вам придется разобрать эту строку первой, и добавить знак второго процента, если необходимо.

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