stringstream CPP

whipbaek·2022년 2월 8일
0

알고리즘

목록 보기
3/5

stringstream

  • istream : input stream
  • ostream : output stream
  • iostream : input output stream

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을 반환한다.)

  • 공백이나 개행으로 구분하여서 읽는다.

  • 결과로 num에 123, 456, 78, 9 의 값이 순서대로 할당되었고 출력되었다.





읽는 변수에 따라 달라진다고 하였는데 이해가 잘 안되었을수도 있겠다, 몇가지 예시를 보면 이해가 쉬울것이다!


int main(void) {

	int num;
	string str = "12ab 34";
	stringstream ss;
	ss.str(str);

	while (ss >> num) {
		cout << num << "\n";
	}

	return 0;
}
Output
12
  • 정수형태인 12를 읽었으나 a를 읽지못해서 결과로 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
  • 단 char형으로 읽을때는 모두 문자로 처리하여 읽는다.
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
  • characters를 읽는 get()함수를 통해서도 읽을 수 있다. 물론 이때도 1과2는 정수형이나 다른 숫자형이 아닌 char형으로 읽혀진다.
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/

profile
코딩 및 CS에 관하여 공부합니다.

0개의 댓글