Lecture4

viewoverlook發表於2024-05-05

Lecture4

What are streams?

“stream: an abstraction for input/output. Streams convert between dataand the stringrepresentation ofdata.”

流: 對輸入輸出的一種抽象。留在資料和資料的字串表示形式之間進行轉換。

典型流: cout 可以列印任何初始型別和大多數STL型別。

“std::cout is an output stream.It has type std::ostream” std::cout 是一個輸出流。它的型別為 std::ostream

“Two ways to classify streams” 流分類的兩種方法

  1. 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

  1. 有型別`std::ostream`

  2. 只能夠向流中傳送資料

    1. 使用`<<`運算子來和流互動
    2. 將任何型別轉換為字串並且傳送到流中
  3. std::cout 是轉到控制檯的輸出流

Output File Streams

  1. 型別`std::ofstream`

  2. “Only send data using the << operator”

    • 將任意型別的資料轉換為字串併傳送給檔案流
  3. 必須初始化連結到您的檔案的您自己的 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:
  1. 清空str

  2. is中提取字元並且存在 str中,直到:

    • 檔案讀取完,設定EOF 位(checked using is.eof())
    • is下一個字元在delim中,會提取但是不會儲存
    • str 超出記憶體, 設定FAIL 位(checked using is.fail())
  3. “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
}