FILE * fPointer;
float amount = 3.1415;
fPointer =fopen("vending.txt","w");
fprintf(fPointer, amount);
printf("The file has been created for the first time and we added the value %f", amount);
fclose(fPointer);
我正在尝试将浮点数保存到文本文件中,但是当我尝试运行此代码时,它会触发编译错误,因为函数
fprintf
期望第二个参数是字符数组,所以我如何将浮点数转换为一个字符串,这样我就可以传递它,我有一个 C# 背景,其中类似 .toString()
的东西是可能的,那么 C 中是否有类似的东西可以直接将浮点数转换为字符串?
如果可以使用C99标准,那么最好的方法是使用
snprintf
函数。第一次调用时,您可以向它传递一个零长度(空)缓冲区,然后它将返回将浮点值转换为字符串所需的长度。然后根据返回的内容分配所需的内存,然后安全地转换。
这解决了此处讨论的 sprintf 问题。
示例:
int len = snprintf(NULL, 0, "%f", amount);
char *result = malloc(len + 1);
snprintf(result, len + 1, "%f", amount);
// do stuff with result
free(result);
第二个参数是格式字符串,后面跟有格式参数:
fprintf(fPointer, "%f", amount);
%f
告诉 fprintf
将此参数 (amount
) 写入浮点值的字符串表示形式。
可以(例如)在此处找到可能的格式说明符列表。
通过使用
sprintf()
我们可以将c语言中的float转换为string
为了更好地理解,请参阅下面的代码
#include <stdio.h>
int main()
{
float f = 1.123456789;
char c[50]; //size of the number
sprintf(c, "%g", f);
printf(c);
printf("\n");
}
希望这对您有帮助。
将浮点数保存到文本文件中
使用
"%e"
、"%g"
、"%a"
要为每个 float
打印
唯一文本,请使用具有足够精度的格式字符串
"%.*e"
、"%.g"
或 "%a"
。
FLT_DECIMAL_DIG - 1
是 "%.*f"
FLT_DECIMAL_DIG
是需要的位数,带"%.*g"
)float
值,而不会过度精确。
#include <float.h>
#include <stdio.h>
fprintf(fPointer, "%.*e", FLT_DECIMAL_DIG - 1, amount);
// or
fprintf(fPointer, "%.g", FLT_DECIMAL_DIG, amount);
// or
fprintf(fPointer, "%a", amount); // Hexadecimal significand
这样做的好处是,可以预先计算想要打印到字符串所需的字符上限(通常约为 18 个)。
// - d . dddddddd e - expo \0
#defined FLT_STR_SIZE (1 + 1 + 1 + (FLT_DECIMAL_DIG - 1) + 1 + 1 + 4 + 1
char buffer[FLT_STR_SIZE];
snprintf(buffer, sizeof buffer, "%.*e", FLT_DECIMAL_DIG - 1, amount);
"%f"
弱点
使用
"%f"
将打印近一半的小 float
,如 0.000000001f
和 -1.2345e-10
0.000000
或 -0.000000
。
使用
"%f"
将打印大的 float
,如 FLT_MAX
,并带有详细文本,如“340282346638528859811704183484516925440.000000”。
OP的编码错误包括:
// OP's code v---- Format string expected here.
// fprintf(fPointer, amount);