본문 바로가기
C/C++

C++ (15주) [ 콘솔 / 파일 입출력 ]

by DeathStar183 2022. 11. 2.

( 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

댓글