摘要:輸出流類型,提供輸出操作一個對象,從標準輸入讀取數據。一個對象,向標準錯誤寫入消息。向一個給定文件寫入數據。完成這些操作后,在返回流之前,對流進行復位,使其處于有效狀態。
istream
對象,從標準輸入讀取數據。ostream
對象,向標準輸出寫入數據。ostream
對象,向標準錯誤寫入消息。istream
對象中讀取輸入數據。ostream
對象中寫入輸出數據。istream
對象中讀取一行數據,存入到一個給定的string
對象中。iostream
頭文件:從標準流中讀寫數據,istream
,ostream
等fstream
頭文件:從文件中讀寫數據,ifstream
,ofstream
等sstream
頭文件:從字符串中讀寫數據,istringstream
,ostringstream
拷貝
或賦值
由于不能拷貝IO對象,因此不能將 形參 或 返回類型 設置為 流類型。進行 IO 操作的函數通常以 引用方式 傳遞和 返回流。讀寫一個IO對象會改變其狀態,因此 傳遞和返回的引用不能用const。
const
的。狀態 | 解釋 |
---|---|
strm:iostate | 是一種機器無關的類型,提供了表達條件狀態的完整功能 |
strm:badbit | 用來指出流已經崩潰 |
strm:failbit | 用來指出一個IO操作失敗了 |
strm:eofbit | 用來指出流到達了文件結束 |
strm:goodbit | 用來指出流未處于錯誤狀態,此值保證為零 |
s.eof() | 若流s 的eofbit 置位,則返回true |
s.fail() | 若流s 的failbit 置位,則返回true |
s.bad() | 若流s 的badbit 置位,則返回true |
s.good() | 若流s 處于有效狀態,則返回true |
s.clear() | 將流s 中所有條件狀態位復位,將流的狀態設置成有效,返回void |
s.clear(flags) | 將流s 中指定的條件狀態位復位,返回void |
s.setstate(flags) | 根據給定的標志位,將流s 中對應的條件狀態位置位,返回void |
s.rdstate() | 返回流s 的當前條件狀態,返回值類型為strm::iostate |
上表中,strm
是一種IO類型,(如istream
), s
是一個流對象。
每個輸出流都管理一個緩沖區,用來保存程序讀寫的數據。文本串可能立即打印出來,也可能被操作系統保存在緩沖區內,隨后再打印。
刷新(即,數據真正寫到輸出設備或文件)緩沖區的IO操縱符
endl
:輸出一個換行符并刷新緩沖區flush
:刷新流,但不添加任何字符ends
:在緩沖區插入空字符null
,然后刷新unitbuf
:告訴流接下來每次操作之后都要進行一次flush
操作。nounitbuf
:回到正常的緩沖方式fstream
定義了三個類型來支持文件IO: ifstream
從一個給定文件讀取數據。ofstream
向一個給定文件寫入數據。fstream
可以讀寫給定文件。操作 | 解釋 |
---|---|
fstream fstrm; | 創建一個未綁定的文件流。 |
fstream fstrm(s); | 創建一個文件流,并打開名為s 的文件,s 可以是string 也可以是char 指針 |
fstream fstrm(s, mode); | 與前一個構造函數類似,但按指定mode 打開文件 |
fstrm.open(s) | 打開名為s 的文件,并和fstrm 綁定 |
fstrm.close() | 關閉和fstrm 綁定的文件 |
fstrm.is_open() | 返回一個bool 值,指出與fstrm 關聯的文件是否成功打開且尚未關閉 |
上表中,fstream
是頭文件fstream
中定義的一個類型,fstrm
是一個文件流對象。
文件模式 | 解釋 |
---|---|
in | 以讀的方式打開 |
out | 以寫的方式打開 |
app | 每次寫操作前均定位到文件末尾 |
ate | 打開文件后立即定位到文件末尾 |
trunc | 截斷文件 |
binary | 以二進制方式進行IO操作。 |
sstream
定義了三個類型來支持內存IO: istringstream
從string
讀取數據。ostringstream
向string
寫入數據。stringstream
可以讀寫給定string
。操作 | 解釋 |
---|---|
sstream strm | 定義一個未綁定的stringstream 對象 |
sstream strm(s) | 用s 初始化對象 |
strm.str() | 返回strm 所保存的string 的拷貝 |
strm.str(s) | 將s 拷貝到strm 中,返回void |
上表中sstream
是頭文件sstream
中任意一個類型。s
是一個string
。
書中演示demo使用
#include #include #include #include using namespace std;typedef struct PersonInfo{ string name; vector phones;}p;int main() { string line, word; vector people; while (getline(cin, line)) { p info; istringstream record(line); record >> info.name; while (record >> word) info.phones.push_back(word); people.push_back(info); } for (auto i : people) { cout << i.name << endl; for (auto j : i.phones) cout << j << " "; cout << endl; } return 0;}
編寫函數,接受一個
istream&
參數,返回值類型也是istream&
。此函數須從給定流中讀取數據,直至遇到文件結束標識時停止。它將讀取的數據打印在標準輸出上。完成這些操作后,在返回流之前,對流進行復位,使其處于有效狀態。
解:
std::istream& func(std::istream &is){ std::string buf; while (is >> buf) std::cout << buf << std::endl; is.clear(); return is;}
測試函數,調用參數為
cin
。
解:
#include using std::istream;istream& func(istream &is){ std::string buf; while (is >> buf) std::cout << buf << std::endl; is.clear(); return is;}int main(){ istream& is = func(std::cin); std::cout << is.rdstate() << std::endl; return 0;}
測試
#include #include using namespace std;istream& f1(istream& is){ int s; while (is >> s) { cout << s << endl; } return is;}istream& f2(istream& is){ int s; while (is >> s) { cout << s << endl; } is.clear(); return is;}int main(){ istream& is = f1(cin); cout << is.rdstate() << endl; istream& is2 = f2(cin); cout << is2.rdstate() << endl; return 0;}
什么情況下,下面的
while
循環會終止?
while (cin >> i) /* ... */
如badbit
、failbit
、eofbit
的任一個被置位,那么檢測流狀態的條件會失敗。
編寫函數,以讀模式打開一個文件,將其內容讀入到一個
string
的vector
中,將每一行作為一個獨立的元素存于vector
中。
#include #include #include #include using namespace std;void ReadFileToVec(const string& filename, vector& vec){ ifstream ifs(filename); if (ifs) { string buf; while (getline(ifs, buf)) vec.push_back(buf); }}
重寫上面的程序,將每個單詞作為一個獨立的元素進行存儲。
void ReadFileToVec(const string& fileName, vector& vec){ ifstream ifs(fileName); if (ifs) { string buf; while (ifs >> buf) vec.push_back(buf); }}
編寫程序,將來自一個文件中的行保存在一個
vector
中。然后使用一個istringstream
從vector
讀取數據元素,每次讀取一個單詞。
#include #include #include #include #include using namespace std;int main(){ //將來自一個文件的行保存到vector中 ifstream ifs("hello.txt"); if (!ifs) { cerr << "no data ?" << endl; return -1; } vector vecline; string line; while(getline(ifs, line)) vecline.push_back(line); ifs.close(); //從vector讀取元素,每次只讀一個單詞 for (auto &s : vecline) { istringstream iss(s); string word; while (iss >> word) cout << word << endl; } return 0;}
本節的程序在外層
while
循環中定義了istringstream
對象。如果record
對象定義在循環之外,你需要對程序進行怎樣的修改?重寫程序,將record
的定義移到while
循環之外,驗證你設想的修改方法是否正確。
解:
#include #include #include #include using std::vector; using std::string; using std::cin; using std::istringstream;struct PersonInfo { string name; vector phones;};int main(){ string line, word; vector people; istringstream record; while (getline(cin, line)) { PersonInfo info; record.clear(); record.str(line); record >> info.name; while (record >> word) info.phones.push_back(word); people.push_back(info); } for (auto &p : people) { std::cout << p.name << " "; for (auto &s : p.phones) std::cout << s << " "; std::cout << std::endl; } return 0;}
我們為什么沒有在
PersonInfo
中使用類內初始化?
解:
因為這里只需要聚合類就夠了,所以沒有必要在PersionInfo
中使用類內初始化。
電話號碼程序
#include #include #include #include #include using namespace std;struct PersonInfo { string name; vector phones;};bool valid(const string& str){ return isdigit(str[0]);}string format(const string& str){ return str.substr(0, 3) + "-" + str.substr(3, 3) + "-" + str.substr(6);}int main(){ //從文件中讀取信息存入vector容器 ifstream ifs("phone.txt"); if (!ifs) { cerr << "no phone numbers ? " << endl; return -1; } vector people; string line, word; istringstream record; while (getline(ifs, line)) { PersonInfo info; record.clear(); record.str(line); record >> info.name; while (record >> word) { info.phones.push_back(word); } people.push_back(info); } //逐個驗證電話號碼 并 改變其格式 for (const auto& entry : people) //對people中的每一項 { //每個循環創建的對象 ostringstream formatted, badnums; //對每個數 for (const auto& nums : entry.phones) { if (!valid(nums)) { badnums << " " << nums; //將數的字符串形式存入badnums } else { //將格式化的字符串寫入formatted formatted << " " << format(nums); } } //沒有錯誤的數 if (badnums.str().empty()) { cout << entry.name << " " << formatted.str() << endl; } else { //打印名字和錯誤的數 cerr << "input error: " << entry.name << " invalid number(s)" << badnums.str() << endl; } } return 0;}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119673.html
摘要:二中流的概念中的流是對一種有序連續且具有方向性的數據的抽象描述。用來進行標準錯誤的輸出。在使用時候必須要包含文件并引入標準命名空間。實際是在其底層維護了一個類型的對象用來保存結果。可以使用將讓返回其底層的對象。 ?本文對比了C語言的輸入與輸出,介紹了流的概念、C++IO流以及stringst...
摘要:過濾器流,如等,是類庫,是為了提供一些類讓你能夠處理一些極為常見的數據格式。讀寫器,由于流和過濾器流還是僅次于處理字節,也就是二進制。過濾器流緩沖流和類將寫入的數據存儲到緩沖區中一個名為的保護字節數組字段,直到緩沖區滿或刷新輸出流。 A little older, a little wiser, but happy to see you. ——Interstellar 2018年了,再...
摘要:通過多個裝飾類實現責任鏈模式,它將對一個輸入流的不同處理分散到不同的中去。 1、基本概念 1.1、InputStream 最基本的字節輸入流,抽象類,定義了讀取原始字節的所有基本方法1.1.1、public abstract int read() throws IOException 讀取一個字節的方法,最基礎的方法1.1.2、public int read(byte b[], in...
摘要:集合的特點集合的特點類介紹類表示了一個持久的屬性集。可保存在流中或從流中加載。屬性列表中每個鍵及其對應值都是一個字符串特點的子類,集合中的方法都可以用。該集合沒有泛型。鍵值可以存儲到集合中,也可以存儲到持久化的設備硬盤盤光盤上。 01Properties集合的特點 * A: Properties集合的特點 * a: Properties類介紹 * Propert...
閱讀 2471·2021-09-09 09:33
閱讀 2870·2019-08-30 15:56
閱讀 3124·2019-08-30 14:21
閱讀 897·2019-08-30 13:01
閱讀 864·2019-08-26 18:27
閱讀 3588·2019-08-26 13:47
閱讀 3456·2019-08-26 10:26
閱讀 1587·2019-08-23 18:38