我正在尝试创建一个具有以下结构的文件:
- 每行有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 );
}
感谢您的回答,
安德烈亚斯
答案 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&)
的东西。