fputs 与 fprintf 和 double

bla*_*pit 2 c printf file fputs

我需要将双精度值放入文件中。因此,对于所有其他字符串,我必须使用 fputs 输出,因为我认为并计时 fputs 比 fprintf 更快。

但如果我想输出双精度值,我无法使用 fputs 做到这一点,所以我尝试了 fprintf。这非常慢。如果我替换 fprintf 并放入 fputs("TEST",file); 我需要更多时间;

我怎样才能像字符串一样快地输出双精度数。我需要先将其转换为字符串吗?

我发现了一些转换。但如果我使用它们,我会像使用 fprintf 一样慢。

那么我怎样才能像将字符串放入文件一样快地将双精度数放入文件中呢?

  fputs("TEST",fileout); //FAST
  fprintf(fileout, "%f",p); //SLOW
Run Code Online (Sandbox Code Playgroud)

编辑:

使用 fprintf double 的时间:

END.PROCESSING.DATA: 2013-04-26 08:10:33.000
END.CALC.IN.FILE: 2013-04-26 08:11:13.000
Run Code Online (Sandbox Code Playgroud)

使用 fputs 字符串的时间:

END.PROCESSING.DATA: 2013-04-26 08:14:10.000
END.CALC.IN.FILE: 2013-04-26 08:14:37.000
Run Code Online (Sandbox Code Playgroud)

当时的代码:

now = time (0);
strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now));
printf ("END.PROCESSING.DATA: %s\n", buff);

//output file
FILE *fileout;
fileout = fopen("out.txt","w");
double p;
for(i=0; i<17000;i++){
  for(j=0; j<i;j++){
    for(z=0;z<400;z++){
      //DO SOME WORK
    }
    p = 1.0;
    fputs(allsubsts[i],fileout);
    fputs(";",fileout);
    fputs(allsubsts[j],fileout);
    fputs(";",fileout);
    //fprintf(fileout, "%.21g", p);
    fputs("TEST",fileout);
    fputs(";\n",fileout);
  }
}
fclose(fileout);

now = time(0);
strftime(buff,100,"%Y-%m-%d %H:%M:%S.000", localtime(&now));
printf("END.CALC.IN.FILE: %s\n",buff);
Run Code Online (Sandbox Code Playgroud)

时间之间的变化只是我在文件中放入双精度字符串而不是 TEST 字符串的变化。

R..*_*R.. 5

将浮点数转换为十进制表示是一个非常慢的操作。您可以尝试使用%a说明符而不是%f将其存储为十六进制浮点数;这应该更快,并且可以安全地保留原始值,而不是一个糟糕的近似值。如果您需要小数,则应该使用%.21g或 类似的,而不是%f,因为后者会丢失大部分精度。

如果这些对您来说都不够快,那么您可能需要直接保存该值的二进制表示形式。