Lecture4
What are streams?
流: 對輸入輸出的一種抽象。留在資料和資料的字串表示形式之間進行轉換。
典型流: cout
可以列印任何初始型別和大多數STL型別。
“std::cout is an output stream.It has type std::ostream” std::cout 是一個輸出流。它的型別為 std::ostream
“Two ways to classify streams” 流分類的兩種方法
- By Direction:
Input streams | reading data(‘std::istream‘) |
Output streams | writing data(‘std::ostream‘) |
Input/Output streams | both(‘std::iostream‘) |
2. By Source or Destination:
Console streams | read/write to console(‘std::out‘) |
File streams | read/write to files(‘std::fstream‘) |
String streams | read/write to strings(‘std::stringstream‘) |
Output Streams
-
有型別`std::ostream`
-
只能夠向流中傳送資料
- 使用`<<`運算子來和流互動
- 將任何型別轉換為字串並且傳送到流中
-
std::cout 是轉到控制檯的輸出流
Output File Streams
-
型別`std::ofstream`
-
“Only send data using the << operator”
- 將任意型別的資料轉換為字串併傳送給檔案流
-
必須初始化連結到您的檔案的您自己的 ofstream 物件
std::ofstream out("out.txt");
// out 現在是一個輸出流輸出目標是out.txt
out<<5<<std::endl; //在out.txt中輸出5
Input Streams
“A note about nomenclature”:關於命名的解釋
- `>>`是流提取運算子(從流中提取資料並把它置於變數中)
- `<<`是流插入運算子(將資料從流中輸出到檔案,控制檯或者字串)
“Input Streams” 輸入流
- `std::istream`
- 只能使用`>>`來獲取字串
- std::cin 是從控制檯獲取輸入的輸入流
“Nitty Gritty Details: std::cin” 詳細資訊:std::cin
-
第一次呼叫 std::cin >> 建立一個命令列提示符,允許使用者鍵入直到按 Enter 鍵
-
每個 >> 只讀取直到下一個空格
-
第一個空格之後的所有內容都會被儲存並在下次呼叫 std::cin >> 時使用
- 它儲存的地方稱為緩衝區!
-
如果緩衝區中沒有任何內容,則 std::cin >> 建立一個新的命令列提示符
-
空格被吃掉;它不會出現在輸出中
Input Streams: When things go wrong
第一種情況:當cin輸入出錯時不會發生崩潰,而是會存0來暗示錯誤
std::string str;
int x;
std::cin >> str >> x;
std::cout << str << " " << x <<std::endl;
對於以下程式碼
std::string str;
int x;
std::string otherStr;
//what happens if input is blah blah blah? std::cin >> str >> x>>otherStr; std::cout << str << " " << x << " " <<otherStr<< std::endl;
str | blah |
x | 0 |
otherStr | NOTHING |
once an error is detected, the input stream’s fail bit is set, and it will no longer accept input
第二種情況:當輸入資料型別不對時,比如接受int但是輸入double,會讀取直到找到不是 int 的東西!
// 輸入2.14
int age; double hourlyWage;
cin>>age; // age 2
cin>>hourlyWage; // hourlyWage 0.14
Questions
std::getline()
//Used to read a line from an input stream
//Function Signature
istream& getline(istream& is, string& str, char delim);
- is: getline reads from
- str: stores output in
- delim: Stops when read.’\n’=default
How it works:
-
清空str
-
從
is
中提取字元並且存在str
中,直到:- 檔案讀取完,設定
EOF
位(checked using is.eof()) is
下一個字元在delim
中,會提取但是不會儲存str
超出記憶體, 設定FAIL
位(checked using is.fail())
- 檔案讀取完,設定
-
“If no chars extracted for any reason, FAIL bit set”
如果由於任何原因沒有提取到字元,則設定 FAIL 位
diffs
- “>>“只會讀取直到空格為止, 不能讀入整個句子
- “>>“會把讀入的資料轉化為對應的資料型別,getline只能產生字串
- “>>“只能停在預先定義好的空格, getline的停止可以自定義
Don’t mix >> with getline
- >> 讀取直到下一個空白字元並且不會超過該空白字元。
- getline 讀取到下一個分隔符(預設情況下為“\n”),並且確實會越過該分隔符。
“Stringstreams” 字串流
- What: A stream that can read from or write to a string object
- Purpose: Allows you to perform input/output operations on a string as if it were a stream
#include<bits/stdc++.h>
int main() {
std::string input = "123";
std::stringstream stream(input);
int num;
stream >> num;
std::cout << num << std::endl; // outputs 123
}