개념

파일 입출력

chan4 2023. 4. 13. 23:18

내용 출처: https://modoocode.com/213

C++의 모든 입출력 클래스는 ios_base를 기반 클래스로 함


ios_base 클래스

- 스트림의 입출력 형식 관련 데이터를 처리

ex) 실수형을 출력할 때, 정밀도를 어떤 식으로 할 것인지, 혹은 정수형 출력 시 10진수로 할지 16진수로 할지 등

ex) 16진수로 입력을 받고 싶을 때

int t;

std::cin.setf( std::ios_base::hex);

std::cin >> t;

 

인자 1개(std::ios_base::hex) : 인자로 준 형식 플래그 적용

인자 2개( , std::ios_base::basefield) : 먼저 basefield 내용 초기화

or

int t;

std::cin >> std::hex >> t;

여기서 std::hex는 조작자!

조작자: 스트림을 조작하여 입력/출력 방식을 바꿔주는 함수를 말함


ios 클래스

- 실제로 *스트림 버퍼(Stream Buffer)를 초기화,

- 현재 입출력 상태 작업의 상태를 처리 (std::cin + )

- eof() : 파일을 읽는 도중 끝에 도달했는지 판별하는 함수, return boolean

- good(): 현재 입출력 작업을 잘 수행할 수 있는 확인하는 함수

- fail(): failbit 또는 badbit가 true면 true를 반환

- clear(): 모든 flag를 초기화 + ignore()

- ignore( 100, '\n' ) : 버퍼에서 '\n'가 나올 때까지 100개를 지움, (최대 100개)

  • 스트림의 상태를 관리하는 4개의 플래그(flag, 비트 1개)가 존재
  1. goodbit: 스트림에 입출력 작업이 가능할 때
  2. badbit: 스트림에 복구 불가능한 오류 발생 시
  3. failbit: 스트림에 복구 가능한 오류 발생 시
  4. eofbit: 입력 작업 시에 EOF 도달 시

*스트림 버퍼(Stream Buffer): 데이터를 내보내거나 받아들이기 전에 임시로 저장하는 것

사용자가 하드디스크에서 파일을 1byte씩 읽는다고 했을 때,

실제로 프로그램은 하드디스크에서 1byte씩 읽어오지 않음

먼저, 한 뭉텅이(ex. 512byte)를 한꺼번에 읽어서 먼저 스트림 버퍼에 저장해 놓는다.

그리고 사용자가 요청할 때마다 버퍼에서 1byte씩 꺼내는 것.

쓸 때도 하드에 바로 쓰는 것이 아니라 버퍼에 일정량 모았다가 한 번에 하드에 쓰게 된다!

왜? 하드디스크에서 읽어오는 작업은 매우 느리기 때문에, 딜레이를 줄이기 위한 작업이다.


istream 클래스

- 실제로 입력을 수행하는 클래스

  • cin은 istream 클래스의 객체 중 하나
  • operator >> : 모든 공백문자(space, enter, tap) 입력 시 무시 = 첫 단어 말고는 입력 받을 수 없음
  • 입력을 하였지만 아직 가져오지 못한 단어들은 버퍼에 저장되어 있음.
 
#include <iostream> 
#include <string>
    
int main() {
    std::string s;
    while (true) {
    std::cin >> s;
    std::cout << "word : " << s << std::endl;
    }
}

 


스트림 버퍼(Stream Buffer)에 대해..

모든 입출력 객체들은 이에 대응되는 스트림 객체를 가지고 있게 됨

이에 대응되는 스트림 버퍼 클래스 = streambuf

스트림: 문자들의 순차적인 나열

* std::stringstream 을 통해 평범한 문자열을 마치 스트림인 것 처럼 이용할 수도 있음

streambuf 클래스는 3개의 포인터를 정의

  • 버퍼 시작 주소 포인터
  • 다음으로 읽을 문자를 가리키는 포인터
  • 버퍼 끝 주소 포인터

std::cin.rdbuf() 을 통해 스트림 버퍼를 불러올 수 있음

std::cin.rdbuf() -> snextc(); 스트림 위치 지정자를 한 칸 전진시킨 후, 그 자리에 해당하는 문자를 엿봄. (읽는 것이 아님)