2010-05-27 5 views
2

다음 구조를 가진 파일을 생성하려고합니다 :
- 각 줄은 32 바이트입니다 - 각 줄은 "% 10i % 3.7 f % 3.7f \ n "floppy가 들어있는 sprintf로 고정 길이 출력 문자열 만들기

내 문제는 다음과 같습니다. 부호가"% 3.7f "에 포함되지 않기 때문에 음수 부동 소수점 숫자가있는 경우 줄이 1 자 또는 2 자까지 길어집니다.

이보다 더 좋은 방법이 있습니까? 귀하의 답변에 대한

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

+ 접두사가 붙어있는 사인도 인쇄 할 수 있습니다. 고정 크기로 인쇄됩니다.

(handiest printf documentation에게 호의).

+0

정확히 내가 무엇을 찾고 있었는지 고맙습니다. – Kungi

0

나는 이것의 sprintf()를 사용하지 않을 것입니다. 그것은 Node::operator>>(ostream&)에 속하는 것과 같습니다.

+0

이. 문제는 C++로 태그가 지정되어 있습니다. OP가 C 코드를 여기에 쓰는 이유가 확실하지 않습니다. – Puppy

+0

나는이 코드를 C++ 프로그램에서 사용하고 있으므로 C++로 질문에 태그를 붙였습니다. 그러나 분명히 이것은 잘못되었습니다 :-). 감사합니다 – Kungi

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

나는 '귀중한 데이터'를 쓸데없이 쓰는 것에 강력히 동의한다. +1! – xtofl

+0

이진 파일을 작성하는 것은 반드시 고려해야 할 가치가 있습니다. 나는 그런 생각조차하지 않았다. 아이디어를 가져 주셔서 감사합니다. – Kungi

+0

이진 파일에 플로트를 쓰는 것은 파일이 항상 같은 프로그램에 의해 읽혀지는 한 괜찮습니다. 또한 형식에서 '*'를 사용하여 너비 또는 정밀도를 인수로 전달할 수 있습니다. – tomlogic