C++ Chapter 18.3 : 문자열 스트림
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 18. 입력과 출력
문자열 스트림
🔔 C++ 표준 입출력 클래스
- include <istream>
- C++프로그램들에서 직접적으로 사용되진 않고 입출력 클래스들의 기반이 되는 기초 클래스로서 자식 클래스들을 사용시 자동으로 헤더에 포함된다.
- #include <iostream>
- 콘솔 입력, 출력에 소통할 수 있는 객체들 정의
istream
타입인cin
,ostream
타입인cout
등등
- 콘솔 입력, 출력에 소통할 수 있는 객체들 정의
- #include <fstream>
- 파일 스트림 클래스 및 템플릿. 파일 입출력시 사용된다.
- #include <iomanip>
- 입출력 옵션 지정
- 조작자들 (모두 함수임)
- boolalpha, dec, endl. fixed, hex, setprecision. shopos, uppercase 등등
- 지난 강의 참고하기
- #include <sstream> 의 클래스들
- 스트림에 들어있는 문자열 객체들을 조작하는데에 사용.
- istringstream : 입력 문자열 스트림 클래스.
- stringstream : 입출력 문자열 스트림 클래스.
- ostringstream : 출력 문자열 스트팀 클래스
- stringbuf : 스트림들의 기초 버퍼 클래스
- 스트림에 들어있는 문자열 객체들을 조작하는데에 사용.
🔔 stringstream
입출력 문자열 스트림 클래스
문자열 스트림에 문자열 넣기 (= 출력)
- 1️⃣ append 되는 경우
<<
stringstream
타입인os
에 연달아os << "Hello~111";
&os << "World!222";
를 실행하면 append되어os
는"Hello~111World222"
가 된다.os
엔endl
혹은\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 s
에os
에 들어있는 문자열이 뽑혀 옴.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()
이제s
에os
에 공백을 포함한 모든 문자열이 들어가게 된다
예제 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
굳이 substr
과 stoi
함수를 사용하지 않더라도 이렇게 문자열 스트림을 사용하여 알아서 타입에 맞게 입력할 수 있다. 꼭 공백으로만 나눌 수 있는 것은 아니고 이 예제처럼 각 데이터 타입에 맞게 나눌 수도 있다! 유용하게 잘 사용하자.
"05"
가 int 정수로서5
로hours
에 입력된다.:
가 char 로서temp
에 입력된다."12"
가 int 정수로서12
로minutes
에 입력된다.:
가 char 로서temp
에 입력된다."48"
가 int 정수로서48
로seconds
에 입력된다.:
가 char 로서temp
에 입력된다.
문자열 스트림 비우기
os.str("")
👉🏻os
를 빈 문자열로 덮어 씌워 버려서 비우는 방법도 있고- 다음 강의 참고!
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기