Question

Je suis en train de créer un fichier qui a la structure suivante:
- Chaque ligne a 32 octets - Chaque ligne ressemble comme cette chaîne de format: "% 10i% 3.7f% 3.7f \ n"

Mon problème est le suivant: Quand j'ai un nombres à virgule flottante négatif la ligne est plus par un ou même deux caractères parce que le signe - ne compte pas au « % 3.7f ».

Est-il possible de le faire plus bien que cela?

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 );
}

Merci pour vos réponses,
Andreas

Était-ce utile?

La solution

Vous pouvez forcer le signe à imprimer aussi avec le préfixe +. printf( "+3.6f", 1.0 ); entraînera une impression de taille fixe

(courtoisie au servirez printf documentation que j'ai jamais vu).

Autres conseils

Pourquoi ne pas simplement écrire un fichier binaire, où le bit de signe est pas une préoccupation? avantage est que (en général), vous écrirez 12 octets vs 32 pour chaque élément (une solution verte :-). Après tout, vous perdez la précision lorsque vous faites un sprintf et un atof de l'autre côté.

Si ce n'est pas viable,

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);

Je ne voudrais pas utiliser sprintf () pour cela. Il ressemble à quelque chose qui appartient à Node::operator>>(ostream&).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top