2011-02-11 3 views

답변

12

난 당신이 찾고있는 무슨 생각이

cout << left << setw(8) << (c->name ? c->name : "") << " - " << c->help << endl; 

leftsetw(8) 조종 함께 printf에 지정자를 서식 %-8s과 같은 효과가있다. 그러나 setw을 사용하기 때문에이 작업을 수행하려면 #include <iomanip>이 필요합니다.

편집 : Matthieu M.이 말한 것처럼 cout을 영구히 변경하여 모든 패딩 작업이 왼쪽 정렬되도록합니다. 이것이 보이는 것만 큼 나쁘지는 않습니다. setw을 명시 적으로 사용하여 일부 패딩을 설정할 때만 적용됩니다. 이 문제를 처리하는 방법에 대한 몇 가지 옵션이 있습니다. 먼저, setw을 사용하기 전에 항상 텍스트를 왼쪽 또는 오른쪽으로 맞추는 데 left 또는 right 매니퓰레이터를 사용하는 방식을 강요 할 수 있습니다. 또는, cout에 플래그의 현재 상태를 캡처하는 flagssetf 기능을 사용할 수 있습니다 :

ios_base::fmtflags currFlags = cout.flags(); 
cout << left << setw(8) << (c->name ? c->name : "") << " - " << c->help << endl; 
cout.setf(currFlags, ios_base::adjustfield); 

이 세 가지 단계로 작동합니다. 첫 번째 줄은 현재 패딩 된 출력을 정렬하는 방법을 포함하여 cout에서 현재 서식 지정 플래그를 읽습니다. 두 번째 줄은 실제로 값을 출력합니다. 마지막으로, 마지막 행은 내부 정렬을 위해 cout의 출력 플래그를 이전 값으로 재설정합니다.

개인적으로 나는 첫 번째 옵션이 더 매력적이라고 ​​생각하지만 기술적으로 더 정확하기 때문에 두 번째 옵션이 존재한다는 것을 알면 분명 좋습니다.

+8

추악함! 내 눈! 그들이 탔다! +1 – Marlon

+4

@ Marlon- 나는 화상을 입지 않는 서식을 가진 단일 좋은 I/O 라이브러리를 찾지 못했습니다. 개인적으로이 버전은'printf '보다 더 좋아합니다. 왜냐하면 훨씬 더 장황한 내용 일지라도 조금 더 명확하기 때문입니다. 또한, 나는 한 번 쉼표/​​왼쪽 맞춤 괄호 키를 깨뜨 렸고, 그래서 가장 긴 시간 동안 나는 이것과 같은 것을 타이핑해야한다는 것을 두려워했습니다. :-) – templatetypedef

+0

@ Marlon 몇 줄 바꿈으로 고통을 덜어 줄 수 있습니다. Aspirin ++를 복용하는 것도 좋습니다. –

9

당신이 가지고있는 경우에 부스트 라이브러리 :

진심
std::cout << boost::format("%-8s - %s\n") % (c->name ? c->name : "") % c->help; 
+0

+1 형식의 경우 분명히 원본에 가까워 훨씬 쉬울 것입니다. –

관련 문제