/**************************************************************
[ 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