fprintf не записывает «%» в файл

0

Поэтому я пытаюсь записать эту строку в текстовый файл;

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" символов в нем (иногда он записывает один, а затем обработанный символ экранируется, иногда он не записывает никаких). Все остальные символы в tree_as_char записываются в файл правильно, и печать строки правильно печатает символы%. Может быть, я никуда не уйду?

Благодарю!

Фил

  • 5
    Подсказка: что означает финальный f в sprintf и fprintf ?
  • 0
    @Rhymoid Отформатирован?
Показать ещё 3 комментария
Теги:

2 ответа

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 процента в строке tree_as_char. Если вам все еще нужна эта line var для других вещей, вы можете выбрать: проанализировать строку, добавить вторичные символы % до записи в указатель файла, использовать 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 просто рассмотрит это как заполнитель, так что вам придется сначала разобрать эту строку и добавить второй знак процента, если это необходимо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню