std::stringstream 을 통해 문자열을 값으로
Project/Win32API로 던그리드 모작

std::stringstream 을 통해 문자열을 값으로

Woon2World :: Programming & Art Life

 

문자열을 값으로

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 = 0int b = 0int 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