본문 바로가기
Programing

cout 사용법

by 밴스 2007. 12. 3.


/**************************************************************

  [ COUT ]

 1) << 연산자 재정의
 2) 출력 메서드
    - put
    - write
 3) 출력 버퍼 비우기
 4) cout을 이용한 출력 형태 지정
 5) 사용자 정의
 6) 기타 출력 형식 변경
**************************************************************/


//───────────────────────────────
//   [ cout을 이용한 출력  ]
//───────────────────────────────
/*
   ostream 클래스 : 수치 데이터를 문자들의 스트림으로 변환 ->
                    화면에 표시 몇개의 클래스 메서드 제공


  1) 오버로딩 << 연산자
     ostream & operator << ( type);
  -> 연이어 출력 가능
  -> 오버로딩을 통해 다양한 type 출력 가능
 
   char *name = "빙고";
   cout << "만세" << name << "!\n";

      -> 만세 를 출력 버퍼로 보내고 cout을 리턴
   -> 빙고 를 출력 버퍼로 보내고 cout을 리턴
   -> !\n  을 출력 버퍼로 보내고 cout을 리턴(사용되지 않는 리턴값)

  2) ostream 메서드들

     cout.put('\');      // 문자 출력
  cout.put('I').put('t');   // o
  cout.put(65);      // ??

     cout.write("test aaa", 10).write("aaa", 3);  
  // 전체 문자열 출력
  -> 특징) cout 객체 리턴, 무조건 개수만큼 출력한다.
*/

//---------------
// 예제 1)
//--------------
/*
#include
using namespace std;

void main()
{
     cout.put('n');      // 문자 출력
  cout.put('I').put('t');   // o
  cout.put(65);      // ??
  cout << endl;

 const char *state1 = "AAA";
 const char *state2 = "BBB";
 const char *state3 = "CCC";

 int len = strlen(state2);
 cout << "루프 첨자 증가 : \n";
 int i;
 for( i=1; i<=len; i++)
 {
  cout.write( state2, i) << "\n";
 }

 // 문자열 길이 초과
 cout << "문자열 길이 초과 : \n";
 cout.write( state2, len+5) << endl;
}
*/

/*
   3) 출력 버퍼 비우기
      기본은 출력버퍼(512byte)가 가득 차게 되면 목적지로 보내어 진다.
   개행 문자를 보내면 버퍼를 자동으로 비워준다.
      긴급 입력을 받아들여야 할 때 버퍼를 비운다.
      cout << "하나의 수 입력 : ";
   cin >> num;
   강제로 버퍼를 비운다.
     flush(cout);
  cout << flush;

  endl;    // 버퍼를 비우고 개행 문자 삽입

   
 4) cout을 이용한 출력 형식 지정

       >> 기본 스트림 형식
       - 한 문자의 경우  필드 폭에 그 문자 출력
    - 정수형은 10진수로 출력
    - 음수인 경우 - 부호 함께 출력
    - 문자열은 문자열의 길이에 맞는 필드 폭에 출력

          - 부동 소수점은 총 6자리 (뒤의 0은 출력되지 않는다.)
*/


/*
//---------------
// 예제 2)
//--------------

#include
using namespace std;

void main()
{
 cout << "1234567890\n";
 char ch = 'k';
 int  t  = 273;
 cout << ch << " : " << t << " : " << -t << endl;
 
 // 부동소수점은 총 6자리
 double f1 = 1.200;
 cout << ch << " : " << (f1 + 1.0/9.0) <<  endl;

 //----------------------------------------------------------------------
 // 화면 출력을 위한 진법 변경(ios_base : 출력 상태를 나타내는 정보)
 //----------------------------------------------------------------------
 cout << "\n\n" << "화면 출력을 위한 진법 변경" << endl;
 int n = 13;
 cout << n << endl;   // 10진법

 cout << hex;
 cout << n << endl;   // 16 진법

 cout << oct <<  n << endl; // 8진법

 dec(cout);
 cout << n << endl;   // 10진법


 //----------------------------------------------------------------------
 // 필드 폭 조정(ios_base : 출력 상태를 나타내는 정보)
 //----------------------------------------------------------------------
 // width : 한번 호출 후 원래의 폭으로 환원된다. 오른쪽으로 정렬된다.
 //         공백으로 조정한다.
 cout << "\n\n" << "필드 폭 조정" << endl;
 int w = cout.width(30);
 cout << "디폴트 필드 폭 = " << w << ":\n";

 cout.width(5);
 cout << "N" << endl;
 cout << "N" << endl;

   
 //----------------------------------------------------------------------
 // 채움 문자 (ios_base : 출력 상태를 나타내는 정보)
 //----------------------------------------------------------------------
 // 채움문자 : 변경될 떄까지 계속 유지된다.
 cout << "\n\n" << "채움 문자" << endl;
 cout.fill('*');
 for( int i= 0; i< 2; i++)
 {
  cout.width(5);
  cout << i << ':';
  cout.width(8);
  cout << i*i << endl;
 }
 cout.width(5);
 cout << "test" << endl;
 cout.width(5);
 cout.fill(' ');
 cout << "test" << endl;


 //----------------------------------------------------------------------
 // 부동 소수점의 출력 정밀도 설정(ios_base : 출력 상태를 나타내는 정보)
 //----------------------------------------------------------------------
 cout << "\n\n" << "부동 소수점의 출력 정밀도 설정" << endl;
 double price1 = 20.40;
 double price2 = 1.9 + 8.0 / 9.0;

 cout <<  price1 << " : " << price2 << endl;

 cout.precision(2);   // 소수점 자리 변경, 다시 설정될때까지 유지 
 cout <<  price1 << " : " << price2 << endl;
 cout <<  price1 << " : " << price2 << endl;


 //----------------------------------------------------------------------
 // 뒤에 붙는 0과 소수점 출력(ios_base : 출력 상태를 나타내는 정보)
 //----------------------------------------------------------------------
 cout.precision(6);   // 소수점 자리 변경, 다시 설정될때까지 유지 
 cout.setf(ios_base::showpoint);
 cout <<  price1 << " : " << price2 << endl;


 //----------------------------------------------------------------------
 // setf의 추가 구현 옵션 1개의 인자 사용(ios_base : 출력 상태를 나타내는 정보)
 //----------------------------------------------------------------------
 cout << "\n\n" << "setf의 추가 구현 옵션 1개의 인자 사용" << endl;
 int a = 63;

 cout.setf(ios_base::showpos); // + 부호 사용
 cout << a << endl;

 cout << hex << a << endl;
 cout.setf(ios_base::uppercase); // 대문자 사용
 cout.setf(ios_base::showbase);  // 0x 사용
 cout << hex << a << endl;

 cout << true << "이다." << endl;
 cout.setf( ios_base::boolalpha);
 cout << true << "이다." << endl;

 //----------------------------------------------------------------------
 // setf의 추가 구현 옵션 2개의 인자 사용(ios_base : 출력 상태를 나타내는 정보)
 //----------------------------------------------------------------------
}
*/

/*
  C++의 cout가 printf보다 사용하기가 여러모로 편리하다는 것을 살펴보았다.
 
  printf가 서식에 다양한 출력 형식을 지정할 수 있다.
  cout도 출력형식을 다양하게 지정할 수가 있다.
  입출력 형식의 지정은 cout의 소속 클래스인 ios 의 데이터 멤버 x_flags를 조작하는 방법과
  manipulator라 불리는 조작 함수를 사용해서 구현된다.
*/


//-----------------------------------------------------------------------------------------------
//  가. 폭(width) 지정, fill 지정
//-----------------------------------------------------------------------------------------------

/*
   출력되는 데이터가 화면상에 차지하는 폭은 별다른 지정을 하지 않고
   데이터를 출력했을 때 데이터의 길이에 맞추어진다.
   cout << 123;하면 3칸, cout << "korea"; 하면 5칸이 화면상에 할당되어 데이터가 출력된다.
  
   1. width : 데이터 고유길이 외의 특정 길이의 폭에 맞추어주고 싶을 경우(ios의 멤버 함수)
      - cout.width(지정하고자 하는 폭);
   2. fill  : 데이터를 출력하고 나머지 남은 부분을 채우는 fill 문자 지정
   - cout.fill(fill 문자);
  

예제와 출력 결과
*/

/*
#include
#include
void main()
{
 int i=3;
 char c='C';
 system("cls");
 cout << c << endl; // [ 출력 : C ]

 cout.width(10);
 cout << 123 << endl; //[출력 : 공백*10 123]

 cout.width(5); // 폭을 5로 지정
 cout.fill('*'); // 채움 문자는 '*'
 cout << c;        // [ 출력 : ****C ]
 cout << endl;

 cout << i << endl; // [ 출력 : 3 ]

 cout.width(10); // 폭을 10으로 지정
 cout.fill('0'); // 채움 문자는 '0'
 cout << i;  // [ 출력 : 0000000003 ]
 cout << endl;
}
*/

/*

  특징 1) 1회용적인 사용

 cout.width(10);
 cout << "echo";  // 10개의 공간 차지
 cout << "off";  //  3칸의 공간 차지

  특징 2) width가 지정하는 폭이란 강제적으로 그 폭에 맞추어라는 뜻이 아니라
       최소한 그 폭은 되어야 함을 의미
 cout.width(8);  
 cout << "ethics"; // 8칸 공간 차지
 cout.width(8);
 cout << "economics"; // 폭 지정 무시하고 9칸 공간 차지

*/


//-----------------------------------------------------------------------------------------------
//  나. 진법 지정
//-----------------------------------------------------------------------------------------------

/*
   printf문의 서식 %d, %o, %h에 해당하는 I/O 스트림의 출력 형식 제어 방법
   같은 수라도 진법에 따라 출력이 달라진다.
*/

/*
#include
#include
void main()
{
 int i=32;
 system("cls");
 cout << i << endl;
 cout << "dec= " << dec << i << endl; // 10진 지정, 32
 cout << "hex= " << hex << i << endl; // 16진 지정, 20
 cout << "oct= " << oct << i << endl; // 8진 지정,  40
}
*/
/*
    - 진법에 대한 아무런 지정이 없다면 10진수로 출력이 이루어진다.
 - dec, hex, oct의 문법적 의미는 함수 포인터이며 바로 다음에 구경하게
      될 manipulator의 일종
*/

//-----------------------------------------------------------------------------------------------
//  다. manipulator
//-----------------------------------------------------------------------------------------------

/*
     입출력 형식을 조작하는 함수들이란 의미
  manipulator는 일부 iostream.h에 정의되어 있는 것도 있지만 대부분은
  iomanip.h에 정의되어 있으므로반드시 iomanip.h를 포함시키도록 한다.

 manipulator의 종류에는 다음과 같은 것들이 있다.

 - dec 숫자 데이터를 10진수로 출력한다.
 - oct 숫자 데이터를 8진수로 출력한다.
 - hex 숫자 데이터를 16진수로 출력한다.
 - endl '\n'을 출력하고 스트림을 비운다.
 - ends 문자열의 끝에 NULL 문자를 추가한다.
 - flush 스트림을 비운다.
 - resetiosflags(long n) n에서 지정한 비트를 reset한다.
 - setiosflags(liong n) n과 x_flags를 OR시켜 n에서 지정한 비트를 set한다.
 - setfill(int n) fill 문자를 지정한다.
 - setw(int n) 데이터가 출력될 화면의 폭을 n으로 지정한다.
 - setprecision(int n) 실수의 유효숫자 자리수를 지정한다.
   지정한 유효숫자 자리에서 반올림된다.

 manipulator 중에는 ios의 멤버 함수와 기능면에서 중복되는 것들도 있다.
 setw    =  ios::width
 setfill =  ios::fill
 기능은 같고 차이점이라면 width, fill은 개별적으로 실행을 시켜야 하고
 manipulator는 << 연산자의 피연산자로 사용될 수 있다는 것
*/

/*
#include
#include
void main()
{
 double x=3.1415;
 int i=16;
 cout << x << endl;   // 3.1415
 cout << setw(10) << setfill('0') << x << endl; // 00003.1415
 cout << setprecision(3) << x << endl; // 3.142
}
*/

//-----------------------------------------------------------------------------------------------
//  라. 좌우 정렬
//-----------------------------------------------------------------------------------------------

/*
  출력될 데이터가 차지할 폭이 데이터의 길이보다 더 길 경우는 데이터를 좌측정렬할 것인지
  우측 정렬할 것인지 두 가지를 선택해야 한다.
  이러한 정렬 정보는 ios 클래스의 데이터 멤버 x_flags에 보관되며 x_flags의 정보를 조작하
  는 setiosflags와 resetiosflags가 준비되어 있다.

  1. setiosflags(long n);
     n의 값이 1인 비트와 대응되는 x_flags의 비트를 1로 만들어 준다.
  즉 그 비트가 가진 의미를 활성화시킨다는 뜻이다.
  setiosflags(0x0014)는 x_flags의 b2, b4를 1로 만들며 이때 출력 형식은 10진수의 오른쪽 정렬

  2. resetiosflags(long n);
    n의 값이 1인 비트와 대응되는 x_flags의 비트를 0으로 만들어 준다.
 즉 그비트가 가진 의미를 활성화시키지 않는다는 뜻이다.

  [ 정 의 ]
  setiosflags의 인수로 사용하기 위한 열거형이 iostream.h에 다음과 같이 정의되어 있다.

 // formatting flags
 enum {
 skipws = 0x0001, // skip whitespace on input
 left = 0x0002, // left-adjust output
 right = 0x0004, // right-adjust output
 internal = 0x0008, // padding after sign or base
 indicatordec = 0x0010, // decimal conversion
 oct = 0x0020, // octal conversion
 hex = 0x0040, // hexadecimal conversion
 showbase = 0x0080, // use base indicator on
 outputshowpoint = 0x0100, // force decimal point (floating output)
 uppercase = 0x0200, // upper-case hex output
 showpos = 0x0400, // add '+' to positive
 integersscientific = 0x0800, // use 1.2345E2 floating
 notationfixed = 0x1000, // use 123.45 floating
 notationunitbuf = 0x2000, // flush all streams after
 insertionstdio = 0x4000 // flush stdout, stderr after insertion
 };
*/

// 예) setiosflags를 사용해 문자열을 좌우로 정렬시켜 출력
/*
#include
#include
void main()
{
 char str[]="string";
 cout.setf(ios::right); // 좌측 정렬
 cout << setw(10) << str << endl;

 cout.setf(ios::left); // 우측 정렬
 cout << setw(10) << str << endl;

 cout.setf(ios::hex); // 16진 출력
 cout.setf(ios::showbase); // 16진 표식을 보인다.
 cout.setf(ios::left); // 좌측 정렬
 cout.setf(ios::uppercase); // 16진수에 대문자 사용
 cout << setw(10) << 12 << endl;
}
 */

반응형

'Programing' 카테고리의 다른 글

Perceptron Traning Algorithm  (0) 2010.04.04
[MFC] 웹, http, html 자동로그인  (0) 2009.11.09
add files to folder 창이 안뜰때  (0) 2009.05.03
동적메모리, 배열 할당하는 법  (0) 2009.04.02
C언어 제곱, 루트  (5) 2009.04.01

댓글0