【问题标题】:Creating a fixed length output string with sprintf containing floats使用包含浮点数的 sprintf 创建一个固定长度的输出字符串
【发布时间】:2010-05-27 09:37:56
【问题描述】:

我正在尝试创建一个具有以下结构的文件:
- 每行有 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 );
}

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

【问题讨论】:

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


    【解决方案1】:

    您也可以使用 + 前缀强制打印标志:printf( "+3.6f", 1.0 ); 将导致固定大小的打印输出。

    (感谢我见过的handiest printf documentation)。

    【讨论】:

    • 谢谢你,这正是我想要的。
    【解决方案2】:

    为什么不直接写一个二进制文件,符号位不是问题?额外的好处是(通常)您将为每个项目写入 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);
    

    【讨论】:

    • 我非常同意无损地编写“有价值的数据”。 +1!
    • 编写二进制文件绝对值得考虑。我什至没有想到这一点。谢谢你的想法。
    • 在二进制文件中写入浮点数是可以的,只要该文件总是由同一个程序读取。此外,您可以在格式中使用“*”来允许将宽度或精度作为参数传递。
    【解决方案3】:

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

    【讨论】:

    • 这个。问题被标记为 C++,我不确定 OP 为什么在这里编写 C 代码。
    • 我在 C++ 程序中使用这段代码,所以我用 C++ 标记了这个问题,但显然这是错误的 :-)。谢谢
    猜你喜欢
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2014-11-21
    • 2016-04-22
    • 1970-01-01
    相关资源
    最近更新 更多