fprintf没有将“%”写入文件

时间:2013-11-20 13:02:00

标签: c++ c

所以我正在尝试将此行写入文本文件;

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”符号时,行中的所有内容都被正确写入(有时它会写入一个,然后转发进行的char被转义,有时它不会写任何内容)。 tree_as_char中的所有其他符号都正确写入文件,打印行正确打印%符号。也许我在某个地方没有正确地逃脱它?

谢谢!

菲尔

2 个答案:

答案 0 :(得分:4)

fprintf会将第二个参数中的任何%符号视为格式化程序。试试fprintf(fp, "%s", line);

答案 1 :(得分: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 var用于其他事情,你可以选择:解析该行,在写入文件指针之前添加辅助%字符,使用fwrite或< / em>,更好(也许):使用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会将其视为占位符,因此您必须首先解析该字符串,并在需要时添加第二个百分号。