代码之家  ›  专栏  ›  技术社区  ›  Kungi

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

  •  2
  • Kungi  · 技术社区  · 16 年前


    -每行看起来都像这样的格式字符串:“%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 回复  |  直到 14 年前
        1
  •  3
  •   xtofl Adam Rosenfield    16 年前

    + 前缀: printf( "+3.6f", 1.0 ); 将产生固定大小的打印输出。

    handiest printf documentation 我从没见过)。

        2
  •  1
  •   xcramps    16 年前

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

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