C++ Chapter 18.3 : 문자열 스트림

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 18. 입력과 출력

문자열 스트림

🔔 C++ 표준 입출력 클래스

image

  • include <istream>
    • C++프로그램들에서 직접적으로 사용되진 않고 입출력 클래스들의 기반이 되는 기초 클래스로서 자식 클래스들을 사용시 자동으로 헤더에 포함된다.
  • #include <iostream>
    • 콘솔 입력, 출력에 소통할 수 있는 객체들 정의
      • istream 타입인 cin,
      • ostream 타입인 cout 등등
  • #include <fstream>
    • 파일 스트림 클래스 및 템플릿. 파일 입출력시 사용된다.
  • #include <iomanip>
    • 입출력 옵션 지정
    • 조작자들 (모두 함수임)
  • #include <sstream> 의 클래스들
    • 스트림에 들어있는 문자열 객체들을 조작하는데에 사용.
      1. istringstream : 입력 문자열 스트림 클래스.
      2. stringstream : 입출력 문자열 스트림 클래스.
      3. ostringstream : 출력 문자열 스트팀 클래스
      4. stringbuf : 스트림들의 기초 버퍼 클래스


🔔 stringstream

입출력 문자열 스트림 클래스

문자열 스트림에 문자열 넣기 (= 출력)

  • 1️⃣ append 되는 경우 <<
    • stringstream 타입인 os에 연달아 os << "Hello~111"; & os << "World!222"; 를 실행하면 append되어 os"Hello~111World222"가 된다.
    • osendl 혹은 \n 도 출력된다.
      stringstream os;
      
      int i = 12345;
      double d = 67.89;
      
      os << i << d;  // os = "1234567.89" 가 된다 
      
      string str1, str2;
      os >> str1 >> str2;    // str1 = "1234567.89"  str2 = "" 빈문자열
      
      stringstream os;
      
      int i = 12345;
      double d = 67.89;
      
      os << i << " " << d;    // 공백 추가!!!!!  os = "12345 67.89" 가 된다 
      
      string str1, str2;
      os >> str1 >> str2;    // str1 = "12345"  str2 = "67.89" 
      
  • 2️⃣ 덮어 씌워지는 경우
    • os.str 함수 👉🏻 현재 os에 들어있는 기존 내용물을 전부 지우고 인수를 os에 넣는다.
      stringstream os;
      
      string str1, str2;
      
      os << 12345 << 67.89;  // os = "1234567.89" 가 된다
      
      os.str("Hello");  // os = "Hello"가 된다. 기존의 "1234567.89"는 날아감
      


문자열 스트림에서 뽑아오기 (= 입력)

예제 1

#include <iostream>  // cout, cin
#include <sstream>  // stringstream

using namespace std;

int main()
{
	stringstream os;
	
	os << "Hello~ World!";//stringstream에 문자열이 들어간다.os = "Hello~ World!"
	os << "Hello2~ World2!";//stringstream에 문자열이 append된다.os = "Hello~ World!Hello2~World2!"

	string s;
	os >> s;	// extraction operator >> 을 사용해서 s에 내용이 들어간다.os = "Hello~ World!Hello2~World2!"
	cout << s << '\n';// 빈칸이 있으면 잘리므로 s = "Hello~" 만 출력된다.

	s = os.str();				// 이렇게 되면 모든 내용이 문자열에 들어간다.os = "Hello~ World!Hello2~World2!"
	cout << s << '\n';  // s = "Hello~ World!Hello2~World2!" 이 출력된다

	os.str("Hello! World!");// stringstream에 들어있는 문자열을 지우고 새로 정의한다.
	s = os.str();	 // os = "Hello! World!" (이제 "Hello~ World!Hello2~World2!" 가 아니라 "Hello World!")
	cout << s << '\n'; // s = "Hello! World!" 이 출력된다

	string temp1, temp2;   // os = "Hello! World!"
	os >> temp1 >> temp2;		// 띄어쓰기를 기준으로 잘리는데 전자는 temp1으로, 후자는 temp2로						
	cout << temp1 << "  |   " << temp2 << "\n";   // temp1 = "Hello!"  temp2 = "World!"
}
  • 1️⃣ >>로 입력 받기
    • 공백을 기준으로 구분하여 입력 받는다. 공백이 포함되지 않는다.
    • os >> s : string sos에 들어있는 문자열이 뽑혀 옴.
    • os에 현재 “Hello World”가 들어있다면 os >> s 할 때 s엔 “Hello”까지만 들어가고 “World”는 os에 남아있다.
      stringstream os;
      
      os << "12345  67.89";	
      
      string temp1, temp2;   // os = "12345  67.89" 상태
      os >> temp1 >> temp2;		// 공백을 기준으로 잘리는데 전자는 temp1으로, 후자는 temp2로						
      cout << temp1 << "  |  " << temp2 << "\n";   // temp1 = "12345"  temp2 = "67.89"
      
      stringstream os;
      
      int i = 12345;
      double d = 67.89;
      
      os << i << " " << d;    //  os = "12345 67.89" 가 된다 
      
      int i2;
      double d2;
      
      os >> i2 >> d2;   // i2 = 12345 정수   d2 = 67.89  로 잘 들어간다.
      
  • 2️⃣ os.str()
    • os.str() 이렇게 인수를 아무것도 넘기지 않았을 경우 os 안에 들어있는 모든 내용의 문자열을 리턴한다.
    • s = os.str() 이제 sos공백을 포함한 모든 문자열이 들어가게 된다


예제 2

    int hours, minutes, seconds;
    char temp;

    string log = "05:12:48";
    istringstream iss(log);
    iss >> hours >> temp >> minutes >> temp >> seconds;

    return 3600 * hours + 60 * minutes + seconds; // 5 * 3600 + 60 * 12 + 48 = 18768

굳이 substrstoi 함수를 사용하지 않더라도 이렇게 문자열 스트림을 사용하여 알아서 타입에 맞게 입력할 수 있다. 꼭 공백으로만 나눌 수 있는 것은 아니고 이 예제처럼 각 데이터 타입에 맞게 나눌 수도 있다! 유용하게 잘 사용하자.

  • "05"가 int 정수로서 5hours에 입력된다.
  • :가 char 로서 temp에 입력된다.
  • "12"가 int 정수로서 12minutes에 입력된다.
  • :가 char 로서 temp에 입력된다.
  • "48"가 int 정수로서 48seconds에 입력된다.
  • :가 char 로서 temp에 입력된다.


문자열 스트림 비우기

  1. os.str("") 👉🏻 os를 빈 문자열로 덮어 씌워 버려서 비우는 방법도 있고
  2. 다음 강의 참고!


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기