( 15주는 사진보단 글로 작성이 되어있는 부분이 많습니다. )
저번주에 보고 간 내용
● 템플릿 (템플릿 함수 , 템플릿 클래스)
● STL(Standard Template Library)
● friend함수
● friend클래스
● 예외처리 ( try, throw, catch )
이번주에 보고 갈 내용
● 콘솔입출력
● ios클래스
● 입출력 조절자
● 파일 입출력
● 명령행 인자 (배우려다가 취소됨)
입출력 객체 ( I/O Stream Object )
● C에서는 printf(), scanf() 함수를 이용하여 콘솔(console) 입출력을 처리gksek.
● 이 함수들의 원형은 표준헤더 stdio.h에 정의되어 C++에서도 그대로 사용할 수 있다.
● 그러나 C++에서는 객체지향 개념을 사용하는 새로운 입출력 내장함수를 제공하고 있다.
● 이를 "입출력 객체(I/O stream object)" 또는 "입출력 스트림(I/O stream)"이라 한다.
● 입출력 스트림은 텍스트로 된 문자열과 데이터 타입을 가지는 객체 사이에서 데이터 변환 작업을 자동으로 수행한다.
입출력 객체 스트림
● 객체란 데이터에 대한 처리를 스스로 할 수 있는 단위
● 사용자가 처리하고자 하는 데이터에 대한 %d, %c, %f, %s 등의 구체적인 서식을 지정하지 않아도 자동 변환되므로
표준 입출력 객체를 사용하면 보다 편리하게 프로그래밍할 수 있다.
● 그래서 객체지향 프로그래밍을 하기 위해서는 기존의 함수보다 이러한 입출력 객체 스트림을 이용하는 것이 좋다.
입 / 출력 스트림 객체
● 입력 스트림 객체인 cin은 삽입연산자(insertion operator) ">>"를 사용하여 데이터를 입력받아 변수를 저장한다.
● 출력 스트림 객체 cout은 추출연산자(extraction operator) "<<"를 이용하여 변수의 내용을 화면에 출력한다.
● C에서 이 연산자는 왼쪽과 오른쪽 시프트(shift)연산을 수행한다.
● C++에서도 그 연산의 본래 의미도 남아 있지만 연산자 중첩에 의하여 입력과 출력을 수행하는 확장된 역할까지
겸하고 있다.
● 입출력 객체를 사용하기 위해서는 전처리기 지시자 "#include"문을 사용하여 를 프로그램에 포함시켜야 한다.
● 콘솔에 출력 ☞ cout<<변수명(값);
● 콘솔로부터 입력 ☞ cin>>변수명;
입출력 객체의 장점
● 입출력 객체는 표준 입출력 함수보다 훨씬 간단한 방법으로 사용한다.
● scanf() 함수에서는 입력 데이터의 형식을 지정하고 입력 장소에 대한 주소를 대상 데이터로 전달해야 했지만 cin 객체는 서식 지정이 필요 없고 입력 장소 또한 주소가 아니라 변수 자체를 대상으로 한다.
● scanf("%d",&x);
● std::cin >> x;
● C++에서는 입출력을 담당하는 스트림(stream) 클래스들이 클래스 라이브러리를 형성하여 이들을 이용하면 매우 편리하다.
● 입출력은 일반 객체들과 동일한 객체들(스트림 객체)로 정의되어 있어 동작 메카니즘이나 형이 다른 기능들과 일관성을 유지한다.
스트림의 역할
● 스트림은 프로그램에 필요한 데이터를 입력받거나 또는 프로그램에서 생성한 자료를 출력하기 위해
C++ 입출력 시스템에서 물리적 입출력 장치를 논리적 입출력으로 정의한것
● 모든 스트림은 그것이 표현하는 물리적 입출력 장치와 관계없이 동일한 방법으로 동작한다.
● 즉, 스트림은 컴퓨터의 입출력장치와 프로그램 사이의 인터페이스 역할을 한다.

입출력 스트림 객체를 제공하는 ios클래스 계층
ios클래스란?
● ios 클래스는 스트림 입출력과 관계되는 형식 입출력 (formatted I/O), 에러 검사, 상태 정보 등을 제공하고,입력/출력/입출력을 지원하는 파생클래스의 스트림을 생성하기 위해 사용되는 기본클래스이다.
● istream 클래스는 입력 작업에 필요한 기능들이 정의되어 있는 클래스
● ostream 클래스는 출력 작업에 필요한 기능들이 정의되어 있는 클래스
● iostream은 istream과 ostream으로부터 다중 상속된 파생클래스로 입력과 출력 모두를 제공하는 양방향 스트림
● ifstream, ofstream, fstream은 파일 입출력 작업을 다루는 클래스로 파일을 대상으로 한다는 점을 제외하고는 istream, ostream, iostream과 유사

표준 스트림
● C++ 프로그램에서 헤더파일 를 포함시키면 다음과 같이 자동으로 열리는 4개의 입출력 스트림 객체가 생성된다.

형식 입출력
● 지금까지의 예제에서는 C++의 디폴트 형식을 이용하여 화면에 정보를 출력하였다.
● 그러나 C++에서도 C의 printf() 함수와 유사한 기능을 수행하는 형식(format) 입출력이 가능하다.
● 형식상태는 비트 형태로 표현되는 형식 플래그(format flag) 값에 의해 그 의미가 지정된다.
● 즉 특정 비트의 값이 0이냐 1이냐에 따라 입출력 형식이 지정된다.
● 형식 플래그는 ios 클래스 내부에 열거형으로 정의되어 있다.
● C++이 제공하는 ios 클래스를 이용하면 사용자가 입출력 형식을 지정할 수 있는 형식 입출력
(formatted I/O)이 가능하다.
● C++의 모든 입출력 스트림에는 입출력 형식을 지정하는 형식상태(format state)가 있어서 지정된 형식상태에 따라 입출력 동작을 수행한다.
형식 플래그 이름들

뭔가 많지만 천천히 설명해드릴테니 걱정하지 않으셔도 됩니다. ^^
ios형식 플래그 설정 및 참조 멤버함수
■ long setf(long f); // 플래그 세트 함수
▶ 형식 플래그를 인수로 받아서 이 플래그 값에 해당하는 비트의 필드를 세트(1) 시키는 함수
■ long unsetf(f); // 플래그 클리어 함수
▶ setf(f) 함수와 반대의 기능을 수행하는 함수로 해당 비트를 클리어 시키는 함수.
▶ 이 함수는 변경되기 이전의 플래그 값을 반환한다.
■ long flags(); // 플래그 참조 함수
▶ 현재 플래그의 상태를 반환하는 함수
■ long flags(long f); // 플래그 참조 함수
▶ 플래그를 인수 f의 비트 패턴으로 세트시키고 변경되기 이전의 플래그 값을 반환
■ long setf(f1, f2); // 플래그 세트 함수
▶ setf(f1, f2) 함수는 f2에 해당하는 비트 필드를 클리어(0) 시킨 다음 f1에 해당하는 비트의 필드를 세트시킴
▶ setf(f1, f2) 함수 형식은 서로 배타적인 플래그가 동시에 세트되는 것을 방지하기 위한 것임
▶ 두 번째 매개변수 f2의 표현을 지원하고자 ios 클래스에 다음과 같이 자주 사용되는 상수가 정의되어 있음
setf(f1,f2)함수의 f2에 자주 사용되는 상수
● setf(f1, f2) 함수는 f2에 해당하는 비트 필드를 클리어(0) 시킨 다음 f1에 해당하는 비트의 필드를 세트시킴
● static const long ios::basefield;
→ cout.setf( ios::hex, ios::basefield ); //16진수로
→ ios::dec | ios::oct | ios::hex
● static const long ios::adjustfield
→ cout.setf( ios::right, ios::adjustfield ); //우측 정렬
→ ios::left | ios::right | ios::internal
● static const long ios::floatfield
→ cout.setf( ios::fixed, ios::floatfield ); //고정 소수점
→ ios::scientific | ios::fixed
15-1. setf () , unsetf () 예시

● setf() 함수로 세트된 각 플래그의 상태는 unsetf() 함수에 의해 클리어 될때 까지 지속된다.
cout . setf ( ios::hex | ios::showcase | ios::uppercase )
각각 16진수로 출력 , 수치 베이스의 접두문자 (앞의 0X) 출력 , 16진수와 과학용 표기 문자 대문자 E 표시
cout . setf ( ios::scientific ) 과학용 표기로 출력을 형식 지정함 (지수 형태로 표기)
cout . unsetf ( ios::hex | ios::scientific )16진수 표기 출력 , 과학용 표기 출력 해체
15-2. 형식 설정 멤버함수

● ios 클래스에는 플래그의 값을 다루는 멤버함수 이외에 자료의 출력시 폭(width), 정밀도(precision) 등을 설정하는 멤버함수가 제공된다
● int width(int w);
● 출력 폭을 w로 지정
● int precision(int p);
● 소수점을 포함하지 않는 전체 자리수를 p로 지정, 소수점 이하 자리수를 지정하고 싶으면 cout<<fixed를 먼저 지정
● int fill(char ch);
● 남는 필드의 위치에 ch문자로 채움
입출력 조절자(I/O manipulator)
■ C++에서는 입출력 조절자(I/O manipulator)라는 함수를 이용한 형식 입출력 기능을 제공한다.
■ 입출력 조절자는 입출력문의 입출력 연산자와 함께 연속적으로 직접 기술이 가능하다는 이점이 있다.
■ width() 멤버함수와 같은 기능을 하는 setw() 입출력 조절자가 있는데 입출력 연산자와 함께 사용할 수 있다.
■ cout << oct << 50 << hex << 50; //50을 8,16진수로 출력
cout << setw(5) << 50 //50을 5칸으로 출력
cout.width(5);
cout <<50;
I/O 입출력 조절자 모음집

set iosflags () / reset iosflags ()
■ 앞의 조절자 중에서 setw()같이 매개변수를 갖는 조절자를 사용하는 경우에는 헤더파일
<iomanip>를 포함해야 한다.
■ 반대로 플래그를 사용하지 않으려면 resetiosflags()를 사용하며, 이 조절자는 unsetf() 함수와
동일한 기능을 한다.
■ 입출력 조절자는 입출력 문장에 함께 있는 스트림에만 영향을 미친다.
■ 이 조절자를 이용하여 특정한 형식 플래그를 설정하고 싶다면 setiosflags()를 사용한다.
■ 이 조절자는 setf() 멤버함수와 동일한 기능을 수행한다.
15-3. setw () / setfill ()

위의 setf () 와는 달리 매개 변수를 가지며, 사용할때 헤더파일 iomanip가 꼭 들어가야 한다.
setw () = cout . width () , setfill () = cout . fill () // 헷갈리지 않게 주의
15-4. setiosflags (ios::left)

파일 입출력을 하는 이유?
→ 입력 : 키보드나 마우스 , 출력 : 모니터나 프린터
→ 입출력이 너무 많은경우에 사용한다.
→ 특정한 값을 계속 저장해놓고 싶을때도 해당됨
→ DB를 쓰는 경우도 있다.
파일 입출력
● 파일을 통한 입출력도 앞의 표준 입출력과 마찬가지로 스트림을 이용하여 입출력 동작이 이루어진다.
● fstream은 입출력 동작 모두를 위한 스트림을 선언할 때 사용된다.
● 파일 입출력 동작을 수행하기 위하여 정의된 클래스로는 ifstream, ofstream, fstream 클래스가 있으며
이들 클래스는 fstream 헤더파일에 정의되어 있다.
● ifstream은 파일로부터의 입력(파일 읽기) 동작을 수행하기 위한 스트림 클래스이고,
ofstream은 파일로 출력 (파일 쓰기) 하기 위한 스트림을 선언하는 클래스이다.
● 파일 스트림의 객체는 사용자가 직접 프로그램 상에서 선언해야 하고, 파일을 개방(open)하고 종결(close)하는
동작이 필요하다.
파일의 개방 / 종결 형식

참고용 함수

15-5. 파일로 출력하기

15-6. 파일로부터 입력받기

15-7. 파일입출력을 수행하는 프로그램

이 예제는 파일 "test.txt"에 Han S. H. 를 출력한 후에 이 파일로부터 문자열을 입력 받는 예이다.
첫번째 공백이 나오면 입력을 종료함 파일의 개방 실패여부는 "!스트림객체명"으로 표시한다.
예를 들어 파일의 개방이 실패하면 "!hout"식은 참이 된다.
15-8. test.txt 에 저장된 내용을 읽어들여 공백을 " * " 로 채워서 출력

→ 공백을 '*'로 대치하여 출력한다.
● 공백문자를 읽어 들이려면 형식 플래그 중 skipws를 클리어시켜야 하는데 이는 표준 입출력과 마찬가지로
unsetf()멤버함수를 사용한다.
● 파일의 끝에 도달했는지를 판단하기 위해 eof()멤버함수를 호출한다.
● eof()멤버함수는 파일의 끝에 도착하면 참을 반환한다.
해당 내용은 인덕대학교 2021년도 2학기 C프로그래밍 한성현 교수님 강좌에서 발췌한 내용입니다.
강좌 내용을 원저작자 허락없이 무단 이용시, 처벌의 대상이 될수 있습니다.
'C > C++' 카테고리의 다른 글
C++ (16주) 잡담 (0) | 2022.11.02 |
---|---|
C++ (14주) [템플릿 , STL , friend , 예외처리] (0) | 2022.10.27 |
C++ (13주) [상속 2 , 가상 함수] (0) | 2022.10.19 |
C++ (12주) [상속 1] (0) | 2022.10.15 |
C++ (11주) [연산자 중첩] (0) | 2022.10.07 |
댓글