std::istream::get
istream에 정의되어 있는 퍼블릭멤버함수로, 스트림에서 unformatted input으로 문자를 추출하는 기능을 한다.
int get() // 1-1
istream& get(char& c) // 1-2
istream& get(char* s, streamsize n) // 2-1
istream& get(char* s, streamsize n, char delim // 2-2
istream& get(streambuf& sb) // 3-1
istream& get(streambuf& sb, char delim) // 3-2
/* 매개변수 설명
c : 추출할 문자를 저장할 변수에 대한 reference
s : 문자 배열에 대한 포인터. 추출된 문자들은 c-string으로 여기에 저장된다.
만약 함수가 어떠한 문자도 추출하지 않아도 n이 0보다 크다면 빈 c-string으로 설정된다. 즉 null 문자 하나만이 저장된다.
n : 널 문자를 포함하여 n개까지만 문자를 저장한다. 만약 n이 0또는 1이라면 문자를 추출하지 않고
failbit를 설정한다. streamsize는 signed integral 타입이다. 함수가 추출할 다음 문자가 delimiting character로 설정된 문자와 같다면 추출을 중단한다.
delim : delimiting character.
*/
1. 스트림에서 하나의 문자를 추출한다.
1-1 : 추출한 문자를 반환한다.
1-2 : 추출한 문자를 저장한다.
2. 스트림에서 문자를 추출하고, 포인터 s에 C-string(null-terminated string of characters)로 저장한다. 입력은 매개변수 delim으로 설정된 구분문자가 나올 때까지 입력받거나, n-1개의 문자를 입력받는다. delimiting character는 입력에 포함되지 않으므로, 다음 입력까지 스트림에 어떠한 동작을 하지 않는다면, 다음 입력 시 가장 처음에 delimiting character가 입력될 것이다. 따라서 delimiting character를 제거하기 위해서는 getline을 사용할 수 있다. 빈 문자열이 추출되더라도 만약 n이 0보다 크다면, 포인터 s의 끝에는 자동으로 null 문자가 추가된다.
2-1 : delim에 아무것도 넘기지 않은 경우이다. 이 경우에는 개행문자가 디폴트 값으로 설정되어 있다.
2-2 : delim에 사용자가 원하는 값을 넣은 상황이다.
3. 스트림에서 문자를 추출하고, 이를 stream buffer 객체 sb에 의해 제어되는 output sequence에 삽입한다. output sequence란 데이터가 쓰여지거나 출력되는 대상을 의미한다. 삽입은 삽입에 실패하거나, delimiting character가 등장하면 중단된다. 이때 sb에 삽입하는데 성공한 문자만이 스트림에서 추출된다. 즉, delimiting character나 삽입에 실패한 문자는 추출되지 않고 스트림에 남아 다음에 추출될 문자로 남아있게 된다.
3-1, 3-2 : 2-1, 2-2와 같음.
또한 함수는 파일의 끝(End Of File)에 도달하면 문자 추출을 중단한다. 만약 조건을 만족하기 전에 파일의 끝에 도달했다면, eof flag를 설정한다.
2. getline
istream에 정의되어 있는 퍼블릭 멤버 함수로, 형식화되지 않은 입력으로 스트림에서 문자들을 추출하는 함수이다. 추출한 문자들은 매개변수로 넘긴 포인터 s에 c-string의 형태로 저장되며, delimiting character를 만나거나, n 개의 문자(널 문자를 포함)를 추출할 때까지 문자를 추출한다.
기본값으로 설정되는 delimiting character는 개행문자 '\n'이다. 만약 추출을 위한 탐색 중 deliminting character를 만나게 되면, delimiting character는 input sequence에 포함되지만, 제거되어서 매개변수로 넘긴 포인터 s에 저장되지 않는다.
또한 함수는 파일의 끝에 도달하면, 문자를 더 이상 추출하지 않는다. 만약 위에서 명시한 중지조건(n개의 문자를 추출하거나, delimiting character를 만남)을 만족하지 않고 파일의 끝에 도달했다면, 함수는 eofbit flag를 설정한다.
만약 어떠한 문자도 추출하지 못했거나, n-1개의 문자를 s에 저장할 때까지 delimiting character를 찾지 못했다면, 함수는 failbit flag를 설정한다. 만약 n-1개의 문자를 저정한 뒤, 정확히 n번째 문자가 delimiting character인 경우, delimiting character가 추출되고, failbit flag는 설정되지 않는다.
만약 빈 문자열이 추출의 결과일지라도 n이 0보다 크다면 널 문자는 자동적으로 s 뒤에 덧붙여진다.
내부적으로 함수는 noskipws가 true로 설정된 sentry 객체를 첫번째로 생성하여 입력 시퀀스에 접근한다. 그런 다음 (good이면), 그것은 그의 관련된 스트림 버퍼 객체로부터 sbumpc 또는 sgetc를 호출하는 것처럼 문자를 추출하고, 마지막으로 sentry 객체를 파괴한 다음 리턴한다(위에서 설명한 동작이 내부적으로 어떻게 돌아가는지를 설명한 것. 결국 위에서 설명한 것과 똑같은 소리임).
간략한 설명(나중에 각각에 대해 글을 작성할 예정)
- noskipws는 공백문자를 건너뛰지 않았음을 의미하는 flag이다. 이는 C++ 표준 라이브러리 함수, 예를 들어 getline()에서 입력 스트림을 읽을 때, 앞쪽 공백 문자를 건너뛸지 말지를 제어하는 데 사용된다. noskipws flag가 true로 설정되면 앞쪽 공백 문자를 건너뛰지 않고 입력에 포함된다. 반면 false로 설정되거나 지정하지 않았다면 앞쪽 공백 문자를 건너뛴다.
- sentry는 C++ 표준 라이브러리에서 입력 스트림을 읽기 전에 스트림의 상태를 확인하는 데 사용되는 객체이다. sentry 객체는 일반적으로 파일이나 표준 입력에서 읽는 것과 같은 스트림 추출 작업의 일부로 생성되며, 이를 읽기 전에 스트림이 유효한 상태인지 확인하는 데 사용된다. sentry 객체는 스트림의 내부 오류 플래그가 설정되어 있는지 확인하고, 스트림이 good state(읽거나 쓸 수 있는 상태이고 오류 플래그가 설정되어 있지 않은 상태. std::ios_base::goodbit 상수로 표시된다.)이면 앞쪽 공백 문자를 건너뛰거나 연결된 출력 스트림을 비우는(flush) 등의 추가 작업이 가능하다. sentry 객체는 일반적으로 임시로 생성되고, 관련된 스트림 추출 작업이 완료된 후 즉시 파괴된다.
- If the stream is in a bad state, it means that there is an error that has occurred, such as reaching the end of the file, and the stream cannot perform input or output operations until the error flag is cleared.
- sbumpc는 C++ 표준 라이브러리의 streambuf 클래스의 멤버함수이다. 이 함수는 입력 스트림 버퍼에서 다음 문자를 읽고 버퍼의 읽기 위치를 이동시킨다. 그리고 다음 문자를 int로 리턴한다. 함수는 버퍼에서 다음 문자를 읽고 버퍼 내 현재 위치를 증가시킨다. 버퍼의 get 영역이 다 사용되었으면, 함수는 버퍼의 underflow() 멤버 함수를 호출하여 버퍼를 채운다. underflow() 함수가 호출되었음에도 버퍼가 공백이라면 함수는 EOF를 리턴한다. 이 함수는 일반적으로 생성된 sentry 객체에서 사용되어 관련된 streambuf 객체에서 문자를 추출하고 int로 반환한다.
- sgetc는 C++ 표준 라이브러리의 streambuf 클래스의 멤버함수이다. 이 함수는 입력 스트림 버퍼에서 현재 위치의 문자를 읽지만, 버퍼의 현재 위치를 수정하지 않는다는 것과 다음 문자가 아닌 현재 문자를 int로 리턴하는 것이 sbumpc와 다르다. 버퍼의 get 영역이 다 사용되었으면, 함수는 버퍼의 underflow() 멤버함수를 호출하여 버퍼를 다시 채운다. underflow() 함수가 호출되었음에도 버퍼가 공백이라면 함수는 EOF를 리턴한다. 이 함수는 일반적으로 생성된 sentry 객체에서 사용되어 관련된 streambuf 객체에서 문자를 추출하고 int로 반환한다.
관련된 글
2023.01.17 - [프로그래밍/PS] - C++ cin 객체 알아보기
참고자료
cplusplus.com
ChatGPT
'프로그래밍 > C++ 문법' 카테고리의 다른 글
C++ Standard Template Library (STL): An Overview (0) | 2023.01.30 |
---|---|
What is extern C and What is function name mangling? (0) | 2023.01.27 |
C++ cin 객체 알아보기 (0) | 2023.01.17 |
C++에서 isdigit, isalpha 함수 알아보기 (0) | 2023.01.13 |
C++에서 memset, fill, fill_n 함수 알아보기 (0) | 2023.01.06 |