ostream에서 formmating 사용하기
FrontPage|FindPage|TitleIndex|RecentChanges|UserPreferences E D R S I M H RSS

재민군이 메일로 보낸 내용(나중에 정리하자아;;)

=================================================================

준호군의 도움으로 cout 등의 ostream 류에서 포맷팅을 말끔하게 하는 방법을 알게 되었고, 유용하다 생각되어 소개합니다.
원래 cout류의 포맷팅은 ios_base에서 노출하는 함수를 사용하는 것이 일반적인 사용방법입니다.
예를 들어 10을 정수로 찍고 8진수로 찍고 싶다면
cout<<10<<", "; cout.setf(ios_base::oct); cout<<10;
이런 식으로 쓰면 됩니다. 하지만 이 방식은 프로그램의 논리적 흐름이 끊기기 때문에 가독성이 별로 좋지 않습니다.
이를 해결하기 위해 C++에서는 manipulator라는 것을 제공하고 있습니다.
간단히 설명하면 함수를 <<의 인자로 받아서, 그 함수에 this pointer를 인자로 넘겨 버리는 것입니다.
자세한 동작은 TC++PL 의 21.4.6을 참고하세요.
따라서 위의 구문은 아래와 같은 쉬운 구문으로 대체할 수 있습니다.
cout<<10<<", "<<oct<<10; //oct는 함수 포인터이다
직관적이고 간단하지 않습니까? 하나의 문제점이라면 oct가 변수인지 뭔지 네임스페이스가 혼동된다는 것입니다.
실제로 저 구문 전에 int oct=3; 이런식으로 선언되어 있으면 함수의 네임스페이스를 덮어 버려서 10, 310 이런식으로 출력되어 버립니다.
이 방식으로 가능한 포맷팅은 다양합니다.
dec, hex, oct 등의 진수 표현은 물론 setw를 통한 필드폭 잡기, setprecistion을 통한 정밀도 설정 등..
다음은 몇 가지 예제입니다.
cout << setw(10) << setfill('$') << -12.1 <<endl; 결과: $$$$$-12.1
float f = 199.9273f;
cout << "A float: " << f << ", scientific notation " << f
<< " " << scientific << f << " fixed notation " << fixed
<< f << endl;
cout << "Formatted to two decimal places " << setprecision(2)
<< f << ", formatted to %.5f " << setprecision(5) << f << endl;
결과: A float: 199.927, scientific notation 199.927 1.999273e+02 fixed notation 199.927307 Formatted to two decimal places 199.93, formatted to %.5f 199.92731


몇몇은 <ios>에 몇몇은 <istream> <ostream> <iostream> 등에 정의되어 있으며, 이도저도 해당되지 않는 넘들은 <iomanip>라는 헤더에 정의되어 있습니다.
함수 포멧만 맞추면 직접 정의할 수도 있으며 정의 방법이 그렇게 어렵지도 않네요. 역시 TC++PL의 21.4.6을 참고..
stream에서 제공하는 타입 안정적 포맷팅을 잘 활용하시길 바랍니다. :)

EditText|FindPage|DeletePage|LikePages| Valid XHTML 1.0! Valid CSS! powered by MoniWiki