使用scanf扫描集读取含多小数的CSV文件时遇到问题
问题分析与解决:sscanf读取CSV数值异常
你这问题一眼就能看出症结——CSV里的时区、经纬度都是带小数的浮点数(比如-6.0、33.567),但你用了%d这个整数格式符去解析,还把变量定义成了int类型,这可不就错位了嘛!
问题根源
%d是专门用来读取十进制整数的格式符,当它遇到小数点.的时候就会停止解析,导致后续的lat、lon、alt都读不到正确的值,自然就异常了。
修正方案
两步就能搞定:
- 调整变量类型:把
tz、lat、lon改成浮点数类型(推荐用double,精度足够),alt是整数可以保留int; - 匹配对应格式符:浮点数用
%lf格式符(对应C语言里的double类型),整数依然用%d。
修正后的代码如下:
char buf[400]; char station[11], city[101], state[11]; // 把时区、经纬度改成double类型,适配浮点数数据 double tz, lat, lon; int alt; fgets(buf, sizeof buf, file); // 已验证该语句正常 // 用%lf解析浮点数,%d解析整数,格式串和数据格式完全匹配 sscanf( buf, "%10[^,],%100[^,],%10[^,],%lf,%lf,%lf,%d", station, city, state, &tz, &lat, &lon, &alt);
额外优化提示
你的测试数据里城市名是带双引号的("BIRMINGHAM MUNICIPAL AP"),当前代码会把引号也读进city变量里。如果想自动去掉引号,可以修改格式串,明确匹配引号:
// 格式串里添加\"来匹配前后的双引号,只读取中间的城市名称 sscanf( buf, "%10[^,],\"%100[^\"]\",%10[^,],%lf,%lf,%lf,%d", station, city, state, &tz, &lat, &lon, &alt);
这样处理后,city里就只会存BIRMINGHAM MUNICIPAL AP,不会带引号了。
内容的提问来源于stack exchange,提问作者Maury Markowitz
相关产品推荐
相关产品推荐

