stringstream
stringstream 이란?
stringstream은 iostream을 상속받는 클래스이다. string과 stream의 두 성격을 가졌으며, 주로 문자열에서 특정 자료형을 추출할 때 사용하게 된다.
Code
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main(void) {
int num;
string str = "123 456 78 9";
stringstream ss;
ss.str(str); // ①
while (ss >> num) { // ②
cout << num << "\n"; // ③
}
return 0;
}
Output
123
456
78
9
①
str()함수를 통해서 string 클래스를 매개변수로 받는다.
선언과 동시에 stringstream ss(str);
과 같이 초기화 할 수도 있다.
②
ss에 입력된 문자열을 하나씩 읽는다, 이 때 읽는 변수가 int형이기에 정수의 형태로 문자열을 읽게된다. (stringstream은 iostream을 상속받는다, 따라서 우리가 cin으로 키보드에서 입력을 받는것과 유사하게 문자열에서 입력을 받는것이다.)
while문을 통하여 num으로 읽을 수 없는 문자열이 나올때까지 읽는다. ( istream은 읽을것이 없으면 0을 반환한다.)
공백이나 개행으로 구분하여서 읽는다.
③
읽는 변수에 따라 달라진다고 하였는데 이해가 잘 안되었을수도 있겠다, 몇가지 예시를 보면 이해가 쉬울것이다!
int main(void) {
int num;
string str = "12ab 34";
stringstream ss;
ss.str(str);
while (ss >> num) {
cout << num << "\n";
}
return 0;
}
Output
12
int main(void) {
char ch;
string str = "ab34";
stringstream ss;
ss.str(str);
while (ss >> ch) {
cout << ch << "\n";
}
return 0;
}
Output
a
b
3
4
int main(void) {
char ch;
string str = "12ab";
stringstream ss;
ss.str(str);
while (!ss.eof()) {
ch = ss.get();
cout << ch << '\n';
}
return 0;
}
Output
a
b
3
4
int main(void) {
char ch;
int num;
string str = "12\n34ab";
stringstream ss;
ss.str(str);
while (ss>>num) {
cout << num << '\n';
}
ss.clear();
while (!ss.eof()) cout << (char)ss.get() << '\n';
//while(ss>>ch) cout<<ch<<'\n';
return 0;
}
Output
a
b
3
4
앞의 숫자는 int형으로 뒤에는 char형으로 읽고싶다면 위와 같은 방식도 가능하다. (get을 사용하였는데 주석해둔대로 while문으로 돌려도 결과는 같다.)
단 int형으로 읽다가 a를 만났을때 stringstream은 더이상 읽을수 없다고 판단하고 파일의 끝이라 생각한다. 그리고 ios 클래스에 존재하는 상태비트 eofbit를 1로 만든다. (stringstream은 ios를 상속받는다)
이 때 clear()함수를 사용하지 않으면 char형으로 읽으려해도 읽을수 없다. 파일의 끝이라 판단하는 state(flags)가 활성화 되었기 때문이다.
clear()함수는 ios 클래스에 존재하는 iostate들을 초기화 해준다. 이때 eofbit 또한 0으로 만들어서 뒤의 내용을 더 읽을수 있도록 도와주는 것이다.
clear함수와 ios헤더에 대한 참고
https://stackoverflow.com/questions/20731/how-do-you-clear-a-stringstream-variable
https://runebook.dev/ko/docs/cpp/header/ios
마무리
알고리즘을 공부하다 알게된 클래스인데 문자열 처리에 큰 도움이 될 거 같아 정리해보았다.
좀 막무가내로 코드를 짜서 예시를 들어서 보기에는 힘들수 있으나.. 이리저리 활용하기 좋아보인다.
공식문서 : https://www.cplusplus.com/reference/sstream/stringstream/