使用包含浮点数的sprintf创建固定长度的输出字符串

时间:2010-05-27 09:37:57

标签: c floating-point printf fixed-length-record

我正在尝试创建一个具有以下结构的文件:
- 每行有32个字节 - 每一行看起来都像这样的格式字符串:“%10i%3.7f%3.7f \ n”

我的问题如下:当我有一个负浮点数时,该行会变长一个甚至两个字符,因为 - 符号不计入“%3.7f”。

有没有办法比这更好地做到这一点?

if( node->lng > 0 && node->lat > 0 ) { 
    sprintf( osm_node_repr, "%10i %3.7f %3.7f\n", node->id, node->lng, node->lat );
} else if (node->lng > 0 && node->lat < 0) {
    sprintf( osm_node_repr, "%10i %3.7f %3.6f\n", node->id, node->lng, node->lat );
} else if (node->lng < 0 && node->lat > 0) {
    sprintf( osm_node_repr, "%10i %3.6f %3.7f\n", node->id, node->lng, node->lat );
} else if ( node->lng < 0 && node->lat < 0 ) { 
    sprintf( osm_node_repr, "%10i %3.6f %3.6f\n", node->id, node->lng, node->lat );
}

感谢您的回答,
安德烈亚斯

3 个答案:

答案 0 :(得分:3)

您也可以使用+前缀强制打印标记:printf( "+3.6f", 1.0 );将导致打印尺寸固定。

(由我见过的handiest printf documentation提供)。

答案 1 :(得分:1)

为什么不写一个二进制文件,其中符号位不是一个问题?额外的好处是(通常)你将为每个项目写入12个字节而不是32个(绿色解决方案:-)。毕竟,在sprintf和另一方的atof时你会失去精确度。

如果这不可行,

int len_lng = lng < 0 ? 6: 7;
int len_lat = lat < 0 ? 6: 7;
char fmt[128];
sprintf(fmt, "%%10i %%3.%df %%3.%df\n", len_lng, len_lat);
sprintf(osm_node_repr, fmt, node->id, node->lng, node->lat);

答案 2 :(得分:0)

我不会为此使用sprintf()。它看起来像属于Node::operator>>(ostream&)的东西。