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