fprintf 未将"%"写入文件

fprintf not writing "%" to file

本文关键字:文件 未将 fprintf      更新时间:2023-10-16

所以我正试图将这一行写入文本文件;

sprintf(line, "%d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %d, %sn", 
          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中的所有其他符号都已正确写入文件,打印该行将正确打印%符号。也许我没有在某个地方逃脱?

谢谢!

Phil

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

天哪,刚刚注意到您正在编写sprintf然后调用fprintf。现在这是没有必要的。您可以通过写以下内容轻松保存sprintf调用:

fprintf(fp, "%d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %d, %sn",
          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,更好(也许):使用fputs:

sprintf(line, "%d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %d, %sn",
          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函数打印百分号(%),则必须转义百分号本身。只需写入%%即可获得1%:

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

将打印10%
如果您的tree_as_char包含百分号,fprintf只会将其视为占位符,因此您必须首先解析该字符串,并在需要时添加第二个百分号。