스트림
C++에서는 여러 가지 장치에 대한 입출력을 통일적인 방법으로 처리할 수 있도록 되어 있다. 이 입출력 기능을 유지하는 개념을 스트림(stream)이라고 한다. 스트림이란 입력과 출력을 바이트(byte)들의 흐름으로 생각한다. 프로그램에서 외부로 흘러나가는 연속된 바이트가 출력 스트림이고, 외부에서 프로그램으로 흘러 들어오는 바이트가 입력 스트림이다.
C++ 스트림의 기능은 istream 클래스, ostream 클래스로 표준 라이브러리 <iostream> 등에서 제공되고 있다. 입력할 때 사용할 cin과 출력할 때 사용할 cout은 다음 클래스의 객체이다. (클래스, 객체는 추후에 배움)
- cin -> 스트림 입력을 수행하는 istream 클래스의 객체
- coit -> 스트림 출력을 수행하는 ostream 클래스의 객체
입출력 스트림의 이용
cin과 >> 기호를 사용하면 키보드로부터 입력을 변수 등에 읽어 들일 수 있다. 시프트 연산자와 같지만 istream 클래스에서는 >> 연산자의 중복이 수행되어 있다. 이 입력용으로 중복된 >> 연산자를 특히 추출 연산자(extraction operator)라고 부른다. 또한 << 연산자에 관해서는 ostream 클래스로 표준 출력에 문자와 수치를 보낼 수 있는 것처럼 중복되어 있다. 이와 같은 << 연산자를 삽입 연산자(insertion operator)라고 부른다.
예제) 삽입과 추출 연산자의 사용
삽입 연산자와 추출 연산자를 이용하여 변수에 값을 입력하고 출력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
int i;
double d;
char str[100];
cout << "정수값을 입력하세요 => ";
cin >> i;
cout << "실수값을 입력하세요 => ";
cin >> d;
cout << "문자열을 입력하세요 => ";
cin >> str;
cout << "입력한 정수값은 " << i << "입니다.\n";
cout << "입력한 실수값은 " << d << "입니다.\n";
cout << "입력한 문자열은 " << str << "입니다.\n";
return 0;
}
<<연산자, >>연산자는 데이터의 형을 의식하지 않고 사용할 수 있다.
1문자의 입출력
위 예제에서 연속된 문자열 "Programming"이 아니고 공백을 포함한 문자열 "This is C++"을 입력해보면 공백 이후의 문자가 읽히지 않는다는 것을 알 수 있다.
이것은 << 연산자가 공백을 읽지 않는 것으로 되어 있기 때문이다. 그래서 여기서는 공백을 포함하는 1문자를 읽는 기능을 가지는 istream 클래스의 get() 멤버 함수를 기억하도록 한다. 또한 ostream 클래스에는 1문자를 출력하는 put() 멤버 함수가 있다.
[구문 : 1문자의 입출력]
get(변수); //1문자를 입력한다
put('문자'); //1문자를 출력한다
예제) << 1문자 입출력 함수를 사용
1문자를 입력하는 get() 함수를 이용하여 공백을 포함한 여러 문자를 입력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
char ch;
cout << "문자를 연속해서 입력하세요 => ";
while (cin.get(ch)) { // 1문자씩 읽어 들인다.
cout.put(ch); // 1문자씩 출력한다.
}
return 0;
}
출력 폭의 지정
그 외에도 istream 클래스와 ostream 클래스의 멤버 함수에는 입출력에 관한 여러 가지 기능이 정의되어 있다. ostream 클래스의 width() 멤버 함수를 사용해 보도록 한다. width() 함수를 사용하면 출력 폭을 지정할 수 있다.
[구문 : 출력 폭의 지정]
width(출력 폭);
예제) 출력의 폭 지정하기
출력 폭을 지정하는 width() 함수를 사용하여 1 ~ 10까지의 정수의 출력 폭을 3으로 지정하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
cout << "123456789012345678901234567890123\n";
for (int i = 0; i <= 10; i++) {
cout.width(3); // 출력 폭을 3으로 한다.
cout << i;
}
cout << '\n';
return 0;
}
필 문자의 지정
width() 함수를 사용해서 출력 폭을 지정하면 공백이 삽입된다. 이때 fill() 함수를 사용하면 공백을 지정 문자로 채울 수 있다.
[구문 : 필 문자의 지정]
fill('문자');
예제) fill() 함수의 사용
fill() 함수를 사용하여 공백을 특정한 지정 문자로 채우는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
cout << "123456789012345678901234567890123\n";
for (int i = 0; i <= 10; i++) {
cout.width(3);
cout.fill('_'); // 필 문자를 '_'로 지정한다.
cout << i;
}
cout << '\n';
return 0;
}
수치의 정밀도를 지정
부동 소수점수를 출력할 때는 유효 자릿수(정밀도)를 지정하는 precision() 함수를 사용할 수 있다.
[구문 : 정밀도의 지정]
precision(정밀도 지정);
예제) 부동 소수점수의 유효 자릿수 지정
precision() 함수를 사용하여 pi의 유효 자릿수를 3.141592653589793으로 지정하여 출력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
double pi = 3.141592653589793;
cout << "12345678901234567890\n";
cout << "--------------------\n";
cout.precision(3); // 정수를 포함한 소수점을 3자리까지 표현한다.
cout << pi << '\n';
cout.precision(5); // 정수를 포함한 소수점을 5자리까지 표현한다.
cout << pi << '\n';
cout.precision(8);
cout << pi << '\n';
cout.precision(16);
cout << pi << '\n';
return 0;
}
서식 상태 플래그의 설정
이외에 서식 상태 플래그 setf() 멤버 함수를 사용해서 여러 가지 서식 설정을 수행할 수 있다. 예로서, 출력 위치를 정렬하는 코드를 기술해 보도록 한다.
예제) 서식 상태 플래그
서식 상태 플래그 setf() 멤버 함수 사용하여 숫자를 왼쪽, 오른쪽에 붙여 출력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
cout << "123456789012345678901234567890123\n";
cout.setf(ios::left, ios::adjustfield); //왼쪽 붙이기의 서식 상태 플래그를 설정한다.
for (int i = 0; i <= 10; i++) {
cout.width(3);
cout.fill('_');
cout << i;
}
cout << '\n';
cout.unsetf(ios::left); //왼쪽 붙이기의 서식 상태 플래그를 해제한다.
cout.setf(ios::right, ios::adjustfield); //오른쪽 붙이기의 서식 상태 플래그를 설정한다.
for (int i = 0; i <= 10; i++) {
cout.width(3);
cout.fill('_');
cout << i;
}
cout << '\n';
return 0;
}
서식 상태 플래그는 setf() 멤버 함수를 호출하는 것으로 설정 가능하다. [ios :: ...]라는 지정이 서식 상태 플래그이다. 이과 같이 ios::left를 설정하면, 출력 폭 내에 왼쪽 붙이기로 출력된다. 또한 unsetf() 멤버 함수의 호출을 하면 서식의 설정이 해제된다.
[구문: 서식 상태 플래그의 설정]
setf(서식 상태 플래그)
[구문: 서식 상태 플래그의 해제]
unsetf(서식 상태 플래그)
서식 상태 플래그 종류
서식 상태 플래그 | 내용 |
ios :: adjustifield | 출력 위치를 설정한다. |
ios :: basefield | 기수를 설정한다. |
ios :: floatfield | 소수의 기법을 설정한다. |
ios :: skipws | 공백 문자를 스킵한다. |
ios :: left | 지정한 폭 내에서 왼쪽 붙이기로 한다. |
ios :: right | 지정한 폭 내에서 오른쪽 붙이기로 한다. |
ios :: internal | 부호를 왼쪽 붙이기, 수치를 오른쪽 붙이기로 한다. |
ios :: dec | 10진수로 한다. |
ios :: oct | 8진수로 한다. |
ios :: hex | 16진수로 한다. |
ios :: showbase | 진수의 앞에 0, 16진수의 앞에 0x를 붙인다. |
ios :: showpoint | 맨끝에 0을 붙인다. |
ios :: showpos | 부호를 붙인다(+를 표시한다) |
ios :: scientific | 과학 표기법으로 한다(e를 사용한다) |
ios :: fixed | 고정 소수점 형식으로 한다. |
ios :: uppercase | 영문자를 대문자로 한다. |
조종자
표준 라이브러리에서는 입출력을 위한 서식을 설정하는 특별한 함수가 정의되어 있다. 이 특별한 함수를 조종자(manipulator)라고 한다.
개행의 출력
개행을 수행하는 조종자가 endl이다. 이 조종자는 에스케이프 시퀀스 '\n'의 출력대신에 사용할 수 있다.
[구문: 개행의 출력]
endl
endl을 '\n' 대신에 사용하면 다음 코드와 같다.
#include <iostream>
using namespace std;
int main()
{
cout << "안녕하십니까!" << endl; //여기에서 개행된다.
cout << "안녕히 가십시오!" << endl;
return 0;
}
10진수 이외의 수치 출력
기수를 변경하는 조종자
조종자 | 내용 |
dec | 서식을 10진수로 설정한다. |
oct | 서식을 8진수로 설정한다. |
hex | 서식을 16진수로 설정한다. |
예제) 10진수 이외의 수치 출력
10진수를 8진수, 16진수로 출력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
int num = 15;
cout << num << "를 10진수로 표기하면 " << dec << num << "이다.\n"; //조종자 'dec'은 10진수로 출력한다.
cout << num << "를 8진수로 표기하면 " << oct << num << "이다.\n"; //조종자 'oct'은 8진수로 출력한다.
cout << num << "를 10진수로 표기하면 " << dec << num << "이다.\n";
//또, 조종자는 한 번 지정하면 지정을 변경할 때까지 그 지정이 사용된다. 그때문에 여기서는 8진수를 10진수로 출력된다.
cout << num << "를 16진수로 표기하면 " << hex << num << "이다.\n"; // 조종자 'hex'은 16진수에 의한 출력을 한다.
return 0;
출력 폭을 지정
조종자를 사용해서 서식 설정을 할 수도 있다. 출력 폭을 지정하는 setw() 조종자가 있다. 단, 이 조종자를 사용하려면 <iomanip>를 인스톨해야 한다. setw() 조종자를 사용하면, width() 멤버 함수를 사용했을 때와 같은 서식 설정을 할 수 있다.
이 외에 입출력 클래스의 멤버 함수를 호출해서 수행한 설정을 다음의 조종자로 수행할 수 있다. 조종자에서 설정한 서식은 변경하지 않는 한 유지되기 때문에 편리하다. 단, <iomanip> 헤더 파일을 추가하는 것을 잊지 않아야 한다.
setprecision(n)은 실수에서 유효 숫자 자리를 지정한다. setfill(문자)은 setw()에서 설정된 폭의 남은 부분을 문자로 채운다. setiosflags(형식 플래그)는 형식 플래그 문자 값으로 설정한다.
필 문자의 지정 ----------------------------------setfill(문자)
실수에서 유효 숫자 자리를 지정(정밀도)-----------setprecision(정수값)
형식 플래그 문자값으로 설정----------------------setiosflags(ios :: dec)
출처: 박흥복, 서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당
'개발 > C++' 카테고리의 다른 글
C++ 변수2 (0) | 2022.02.20 |
---|---|
C++ 변수 (0) | 2022.02.17 |
C++ 프로그래밍의 시작 (0) | 2022.02.15 |
C++ 프로그래밍의 기본2 (0) | 2022.02.15 |
C++ 프로그래밍의 기본 (0) | 2022.02.15 |