문자열을 값으로
int, double, long 같은 primitive 자료형은 <string> 헤더만 추가하면 얼마든지 std::stoi, std::stod, std::stol 과 같은 함수를 통해 문자열을 실제 값으로 변환할 수 있다.
그러나 각각의 함수 이름을 외워야 하는 것은 물론, 사용자 정의 클래스로 변환해주는 함수는 존재하지 않는다는 단점이 있다.
stringstream
std::stringstream 을 입력하면 문자열을 입출력 스트림처럼 다룰 수 있다. ( 입출력 스트림은 std::cin 과 std:: cout 으로 대표된다. )
스트림에 출력된 내용은 스트림 내부에 문자열로 변환되어 저장되고
스트림에서 입력받을 때에는 문자열을 꺼내와 입력받을 객체의 타입에 맞게 변환한다.
std::iostream 을 상속하니 ( is - a 관계 ) std::iostream 에서 가능한 primitive 타입의 입출력이 마찬가지로 std::stringstream 에서도 가능하다.
std::stringstream 에 int나 double과 같은 자료형을 출력할 때에는 숫자가 문자열로 변환되어 저장된다. 공백 없이 저장되므로 연속된 숫자의 출력을 할 때는 사이사이에 ' ' 를 추가하여 구분해주어야 한다.
std::stringstream 으로부터 int나 double과 같은 자료형을 입력받을 때에는 숫자가 아닌 문자( 알파벳, 공백 등 )를 만날 때까지의 문자열을 꺼내와 숫자로 변환해 입력받는다.
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
stringstream ss;
int a, b, c;
ss << "3 4 5\n";
ss >> a >> b >> c;
cout << '(' << a << ", " << b << ", " << c << ')' << endl; // (3, 4, 5)
ss.str( "6 7 8\n" );
ss >> a >> b >> c;
ss.str( "" );
cout << '(' << a << ", " << b << ", " << c << ')' << endl; // (6, 7, 8)
ss << 9 << ' ' << 10 << ' ' << 11 << '\n';
ss >> a >> b >> c;
cout << '(' << a << ", " << b << ", " << c << ')' << endl; // (9, 10, 11)
}
|
cs |
- std::stringstream 에 값을 출력할 때는 operator<< 를 이용한다.
str() 함수를 호출하는 것으로 스트림이 특정한 문자열의 값을 가지도록 할 수도 있다.
이 경우 문자열을 비울때에는 str( "" ); 와 같이 빈 문자열의 값을 가지도록 되돌려 놓아야 한다. - std::stringstream 에서 값을 입력받을 때는 operator>> 를 이용한다.
operator>> 의 우측 인자로 객체를 주면 객체에 값을 입력하는 것이 가능하다.
사용자 정의 클래스의 입출력
사용자 정의 클래스의 입출력을 다룰 때 std::iostream 의 operator<<, operator>> 를 오버로딩하게 되는데, 이 함수들만 있으면 std::stringstream 을 위한 함수를 따로 준비할 필요가 없다. std::stringstream 은 std::iostream 을 상속하기 때문이다.
사용자 정의 클래스는 primitive 타입의 조합에 불과하므로, 이 함수에서는 멤버 primitive 객체들을 일괄적으로 스트림으로부터 받아오거나 스트림에 넘긴다.
#include <iostream>
#include <sstream>
using namespace std;
class MyClass
{
public:
MyClass( int a = 0, int b = 0, int c = 0 ) : a{ a }, b{ b }, c{ c } {}
MyClass( const MyClass& other ) : a{ other.a }, b{ other.b }, c{ other.c } {}
MyClass& operator=( const MyClass& other ) { a = other.a; b = other.b; c = other.c; }
friend ostream& operator<<( ostream& os, const MyClass& my )
{
os << '(' << my.a << ", " << my.b << ", " << my.c << ')';
return os;
}
friend istream& operator>>( istream& is, MyClass& my )
{
is >> my.a >> my.b >> my.c;
return is;
}
private:
int a;
int b;
int c;
};
int main()
{
stringstream ss;
ss << "3 4 5\n";
MyClass My1;
ss >> My1;
ss.str( "6 7 8\n" );
MyClass My2;
ss >> My2;
ss.str( "" );
ss << 9 << ' ' << 10 << ' ' << 11 << '\n';
MyClass My3;
ss >> My3;
cout << My1 << endl; // (3, 4, 5)
cout << My2 << endl; // (6, 7, 8)
cout << My3 << endl; // (9, 10, 11)
}
|
cs |
- std::stringstream 은 std::iostream 이므로 (상속 관계) 이들을 위한 operator>>, operator<< 가 정의된 타입들과 상호작용할 수 있다.
'Project > Win32API로 던그리드 모작' 카테고리의 다른 글
데이터베이스 구현 (0) | 2021.08.23 |
---|---|
std::iostream 으로 std::tuple 입출력하기 (0) | 2021.08.23 |
코드 리팩토링 (0) | 2021.08.22 |
csv 문서 파싱 (0) | 2021.08.19 |
게임 프레임 관리 (0) | 2021.08.19 |