파일 입출력
내용 출처: 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개)가 존재
- goodbit: 스트림에 입출력 작업이 가능할 때
- badbit: 스트림에 복구 불가능한 오류 발생 시
- failbit: 스트림에 복구 가능한 오류 발생 시
- 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(); 스트림 위치 지정자를 한 칸 전진시킨 후, 그 자리에 해당하는 문자를 엿봄. (읽는 것이 아님)
