如何从文件里读取double类型的数据?

GeoPhoenix 2006-01-10 09:56:12
昨天发了一个帖子,问到了这个问题,但是大虾的回到没有实质性的解决问题,下面我再把这个问题详细描述一下:
在文件里存放的一系列浮点数(文本格式,非二进制格式),但是偶尔可能存在一个很大的数据,比如文件里的内容是37434015.0 用fscanf(fp,"%f",&dat),读入内存后就变成了37434016.0?
我在一个Edit控件里放的文本是37434015.0,结果用StrToFloat()转换后也变成了37434016.0,这个问题的原因估计是浮点数的精度原因造成的,但是C语言没有提供读取double类型数据的方法,我就纳
闷难道这个问题就一直没有人发现吗?希望各位大虾赐教解决办法,包括输入/输出文本类型的double 数据,谢谢!
...全文
1107 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
CACACACACA 2006-01-10
  • 打赏
  • 举报
回复
to:
/*
但是C语言没有提供读取double类型数据的方法,我就纳
闷难道这个问题就一直没有人发现吗?
*/

一般的c书籍都会有 fscanf(fp, "%lf", &dat )的介绍的.只是楼主没有看仔细.
kongguangming 2006-01-10
  • 打赏
  • 举报
回复
存储用字符串吧,使用时再转换
zephyr007 2006-01-10
  • 打赏
  • 举报
回复
先用文本方式读入,保存在String中,然后使用c函数 atof(),改函数返回double类型
ccrun.com 2006-01-10
  • 打赏
  • 举报
回复
昨天太晚了我就睡觉了。

正如季老大所说,用fscanf的%lf参数。
FILE *fp = fopen("xx.txt", "r");
double dat;
fscanf(fp, "%lf", &dat);
// 使用dat就可以了
fclose(fp);
rudolf_he 2006-01-10
  • 打赏
  • 举报
回复
位数的问题还是很有些人不知道啊。

学习学习!!
jishiping 2006-01-10
  • 打赏
  • 举报
回复
float 的精度比较低,你的要求,需要用double来存贮。StrToFloat 使用的是double,不会有你说的问题,我猜测你是用float变量来存放的,所以才会出现你说的问题。使用fscanf,scanf,printf等函数时,%f表示一般的浮点数(float类型),加上l之后(也就是%lf)就是double类型了,同时变量必须使用double类型,这样就可以满足你的要求了。
netsys2 2006-01-10
  • 打赏
  • 举报
回复
我做过FLOAT,DOUBLE的存储。

这个的确是因为浮点数的精度来的,

例如:

float f1 = 1234.567;

你在做float到char *的转换时,你需要几位精度,它就输出几位!

你在存储时按BYTE类型存储,FLOAT为4个BYTE,DOUBLE为8个BYTE。

读出时不要用scanf,直接用fopen,fread读出数据,然后:

union{
float f;
char c[4];
}uf;
union{
double d;
char c[8];
}ud;

//save
ud.d = 你的double数据;
fwrite(ud.c,1,8,fp);//写盘

// read
fread(ud.c,1,8,fp);
ud.d就是你要的东西。

如果是float,把上面的8改为4就可。

保证可以!

chpst 2006-01-10
  • 打赏
  • 举报
回复
/* Input a name, age and salary as a string, integer, and double */
printf("\nPlease enter your name, age and salary\n");

scanf("%20s %d %lf", name, &age, &salary);
/*
%
  • [width] [F|N] [h|l|L] type_char
    h|l|L] (Optional) Argument-type modifier. Overrides default type of address argument:

    h = short int
    l = long int, if type_char specifies integer conversion

    l = double, if type_char specifies floating-point conversion

    L = long double, (valid only with floating-point conversion)
    */
lurel 2006-01-10
  • 打赏
  • 举报
回复
我一般都转化成string格式来处理,如果数据太长的话,我会考虑分段处理.
CityHost 2006-01-10
  • 打赏
  • 举报
回复
没测试过,帮你顶一下吧
houing_0123 2006-01-10
  • 打赏
  • 举报
回复
同意 jishiping(JSP 季世平) 的方法,呵呵!
flowercity 2006-01-10
  • 打赏
  • 举报
回复
是啊
其实c语言有很多实用的函数
就像我搞串口通信
自己写一个函数实现了进制转换
结果别人说c语言本来就有
郁闷死了

用atol函数吧

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧