Создание выходной строки фиксированной длины с помощью sprintf, содержащей числа с плавающей точкой - PullRequest
2 голосов
/ 27 мая 2010

Я пытаюсь создать файл, который имеет следующую структуру:
- Каждая строка имеет 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 );
}

Спасибо за ваши ответы,
Andreas

Ответы [ 3 ]

3 голосов
/ 27 мая 2010

Вы можете принудительно распечатать знак, также используя префикс +: printf( "+3.6f", 1.0 ); приведет к печати фиксированного размера.

(любезно предоставлено самой удобной документации printf , которую я когда-либо видел).

1 голос
/ 27 мая 2010

Почему бы просто не написать двоичный файл, где бит знака не имеет значения? Дополнительным преимуществом является то, что (как правило) вы будете писать 12 байтов против 32 для каждого элемента (зеленое решение :-). В конце концов, вы теряете точность при выполнении спринта и ато на другой стороне.

Если это невозможно,

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);
0 голосов
/ 27 мая 2010

Я бы не использовал sprintf () для этого. Похоже, что-то принадлежит Node::operator>>(ostream&).

...