成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【C++】IO庫(kù) : IO類,文件輸入輸出,string流

Youngs / 2513人閱讀

摘要:輸出流類型,提供輸出操作一個(gè)對(duì)象,從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)。一個(gè)對(duì)象,向標(biāo)準(zhǔn)錯(cuò)誤寫入消息。向一個(gè)給定文件寫入數(shù)據(jù)。完成這些操作后,在返回流之前,對(duì)流進(jìn)行復(fù)位,使其處于有效狀態(tài)。

前面已經(jīng)在用的IO庫(kù)設(shè)施

  • istream:輸入流類型,提供輸入操作。
  • ostream:輸出流類型,提供輸出操作
  • cin:一個(gè)istream對(duì)象,從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)。
  • cout:一個(gè)ostream對(duì)象,向標(biāo)準(zhǔn)輸出寫入數(shù)據(jù)。
  • cerr:一個(gè)ostream對(duì)象,向標(biāo)準(zhǔn)錯(cuò)誤寫入消息。
  • >>運(yùn)算符:用來(lái)從一個(gè)istream對(duì)象中讀取輸入數(shù)據(jù)。
  • <<運(yùn)算符:用來(lái)向一個(gè)ostream對(duì)象中寫入輸出數(shù)據(jù)。
  • getline函數(shù):從一個(gè)給定的istream對(duì)象中讀取一行數(shù)據(jù),存入到一個(gè)給定的string對(duì)象中。

IO類

  • iostream頭文件:從標(biāo)準(zhǔn)流中讀寫數(shù)據(jù),istream,ostream
  • fstream頭文件:從文件中讀寫數(shù)據(jù),ifstream,ofstream
  • sstream頭文件:從字符串中讀寫數(shù)據(jù),istringstream,ostringstream

IO對(duì)象不能拷貝賦值

由于不能拷貝IO對(duì)象,因此不能將 形參 或 返回類型 設(shè)置為 流類型。進(jìn)行 IO 操作的函數(shù)通常以 引用方式 傳遞和 返回流。讀寫一個(gè)IO對(duì)象會(huì)改變其狀態(tài),因此 傳遞和返回的引用不能用const。

  • 1.IO對(duì)象不能存在容器里.
  • 2.形參和返回類型也不能是流類型。
  • 3.形參和返回類型一般是流的引用。
  • 4.讀寫一個(gè)IO對(duì)象會(huì)改變其狀態(tài),因此傳遞和返回的引用不能是const的。

條件狀態(tài)

狀態(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()若流seofbit置位,則返回true
s.fail()若流sfailbit置位,則返回true
s.bad()若流sbadbit置位,則返回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特有的操作

操作解釋
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操作。

string流

  • 頭文件sstream定義了三個(gè)類型來(lái)支持內(nèi)存IO:
    • istringstreamstring讀取數(shù)據(jù)。
    • ostringstreamstring寫入數(shù)據(jù)。
    • stringstream可以讀寫給定string。

stringstream特有的操作

操作解釋
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;}

練習(xí)

練習(xí)8.1

編寫函數(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;}

練習(xí)8.2

測(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;}

練習(xí)8.3

什么情況下,下面的while循環(huán)會(huì)終止?

while (cin >> i) /*  ...    */

badbit、failbiteofbit 的任一個(gè)被置位,那么檢測(cè)流狀態(tài)的條件會(huì)失敗。

練習(xí)8.4

編寫函數(shù),以讀模式打開一個(gè)文件,將其內(nèi)容讀入到一個(gè)stringvector中,將每一行作為一個(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);	}}

練習(xí)8.5

重寫上面的程序,將每個(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);    }}

練習(xí)8.10

編寫程序,將來(lái)自一個(gè)文件中的行保存在一個(gè)vector中。然后使用一個(gè)istringstreamvector讀取數(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;}

練習(xí)8.11

本節(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;}

練習(xí)8.12

我們?yōu)槭裁礇](méi)有在PersonInfo中使用類內(nèi)初始化?

解:

因?yàn)檫@里只需要聚合類就夠了,所以沒(méi)有必要在PersionInfo中使用類內(nèi)初始化。

練習(xí)8.13

電話號(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

相關(guān)文章

  • [C/C++]C++IO

    摘要:二中流的概念中的流是對(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...

    Lin_R 評(píng)論0 收藏0
  • C++IO詳解

    摘要:在使用時(shí)候必須要包含頭文件并引入標(biāo)準(zhǔn)命名空間。在該頭文件下,標(biāo)準(zhǔn)庫(kù)三個(gè)類進(jìn)行流的輸入進(jìn)行流的輸出進(jìn)行流的輸入輸出將結(jié)構(gòu)體的內(nèi)容轉(zhuǎn)換成字符串字符串的內(nèi)容輸出到結(jié)構(gòu)體當(dāng)中注意實(shí)際是在其底層維護(hù)了一個(gè)類型的對(duì)象用來(lái)保存結(jié)果。 ...

    trilever 評(píng)論0 收藏0
  • 2018年第一周-Java的IO系統(tǒng)

    摘要:過(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年了,再...

    kgbook 評(píng)論0 收藏0
  • 從設(shè)計(jì)者的角度理解Java IO

    摘要:通過(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...

    Flink_China 評(píng)論0 收藏0
  • 1、Properties集合 2、序列化與反序列化 3、打印 4、commons-IO

    摘要:集合的特點(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...

    aboutU 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Youngs

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<