国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Youngs / 2470人閱讀

摘要:輸出流類型,提供輸出操作一個對象,從標準輸入讀取數據。一個對象,向標準錯誤寫入消息。向一個給定文件寫入數據。完成這些操作后,在返回流之前,對流進行復位,使其處于有效狀態。

前面已經在用的IO庫設施

  • istream:輸入流類型,提供輸入操作。
  • ostream:輸出流類型,提供輸出操作
  • cin:一個istream對象,從標準輸入讀取數據。
  • cout:一個ostream對象,向標準輸出寫入數據。
  • cerr:一個ostream對象,向標準錯誤寫入消息。
  • >>運算符:用來從一個istream對象中讀取輸入數據。
  • <<運算符:用來向一個ostream對象中寫入輸出數據。
  • getline函數:從一個給定的istream對象中讀取一行數據,存入到一個給定的string對象中。

IO類

  • iostream頭文件:從標準流中讀寫數據,istream,ostream
  • fstream頭文件:從文件中讀寫數據,ifstream,ofstream
  • sstream頭文件:從字符串中讀寫數據,istringstream,ostringstream

IO對象不能拷貝賦值

由于不能拷貝IO對象,因此不能將 形參 或 返回類型 設置為 流類型。進行 IO 操作的函數通常以 引用方式 傳遞和 返回流。讀寫一個IO對象會改變其狀態,因此 傳遞和返回的引用不能用const

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

條件狀態

狀態解釋
strm:iostate是一種機器無關的類型,提供了表達條件狀態的完整功能
strm:badbit用來指出流已經崩潰
strm:failbit用來指出一個IO操作失敗了
strm:eofbit用來指出流到達了文件結束
strm:goodbit用來指出流未處于錯誤狀態,此值保證為零
s.eof()若流seofbit置位,則返回true
s.fail()若流sfailbit置位,則返回true
s.bad()若流sbadbit置位,則返回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特有的操作

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

string流

  • 頭文件sstream定義了三個類型來支持內存IO:
    • istringstreamstring讀取數據。
    • ostringstreamstring寫入數據。
    • stringstream可以讀寫給定string

stringstream特有的操作

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

練習

練習8.1

編寫函數,接受一個istream&參數,返回值類型也是istream&。此函數須從給定流中讀取數據,直至遇到文件結束標識時停止。它將讀取的數據打印在標準輸出上。完成這些操作后,在返回流之前,對流進行復位,使其處于有效狀態。

解:

std::istream& func(std::istream &is){    std::string buf;    while (is >> buf)        std::cout << buf << std::endl;    is.clear();    return is;}

練習8.2

測試函數,調用參數為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;}

練習8.3

什么情況下,下面的while循環會終止?

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

badbitfailbiteofbit 的任一個被置位,那么檢測流狀態的條件會失敗。

練習8.4

編寫函數,以讀模式打開一個文件,將其內容讀入到一個stringvector中,將每一行作為一個獨立的元素存于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);	}}

練習8.5

重寫上面的程序,將每個單詞作為一個獨立的元素進行存儲。

void ReadFileToVec(const string& fileName, vector& vec){    ifstream ifs(fileName);    if (ifs)    {        string buf;        while (ifs >> buf)            vec.push_back(buf);    }}

練習8.10

編寫程序,將來自一個文件中的行保存在一個vector中。然后使用一個istringstreamvector讀取數據元素,每次讀取一個單詞。

#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;}

練習8.11

本節的程序在外層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;}

練習8.12

我們為什么沒有在PersonInfo中使用類內初始化?

解:

因為這里只需要聚合類就夠了,所以沒有必要在PersionInfo中使用類內初始化。

練習8.13

電話號碼程序

#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++]C++IO

    摘要:二中流的概念中的流是對一種有序連續且具有方向性的數據的抽象描述。用來進行標準錯誤的輸出。在使用時候必須要包含文件并引入標準命名空間。實際是在其底層維護了一個類型的對象用來保存結果。可以使用將讓返回其底層的對象。 ?本文對比了C語言的輸入與輸出,介紹了流的概念、C++IO流以及stringst...

    Lin_R 評論0 收藏0
  • C++IO詳解

    摘要:在使用時候必須要包含頭文件并引入標準命名空間。在該頭文件下,標準庫三個類進行流的輸入進行流的輸出進行流的輸入輸出將結構體的內容轉換成字符串字符串的內容輸出到結構體當中注意實際是在其底層維護了一個類型的對象用來保存結果。 ...

    trilever 評論0 收藏0
  • 2018年第一周-Java的IO系統

    摘要:過濾器流,如等,是類庫,是為了提供一些類讓你能夠處理一些極為常見的數據格式。讀寫器,由于流和過濾器流還是僅次于處理字節,也就是二進制。過濾器流緩沖流和類將寫入的數據存儲到緩沖區中一個名為的保護字節數組字段,直到緩沖區滿或刷新輸出流。 A little older, a little wiser, but happy to see you. ——Interstellar 2018年了,再...

    kgbook 評論0 收藏0
  • 從設計者的角度理解Java IO

    摘要:通過多個裝飾類實現責任鏈模式,它將對一個輸入流的不同處理分散到不同的中去。 1、基本概念 1.1、InputStream 最基本的字節輸入流,抽象類,定義了讀取原始字節的所有基本方法1.1.1、public abstract int read() throws IOException 讀取一個字節的方法,最基礎的方法1.1.2、public int read(byte b[], in...

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

    摘要:集合的特點集合的特點類介紹類表示了一個持久的屬性集。可保存在流中或從流中加載。屬性列表中每個鍵及其對應值都是一個字符串特點的子類,集合中的方法都可以用。該集合沒有泛型。鍵值可以存儲到集合中,也可以存儲到持久化的設備硬盤盤光盤上。 01Properties集合的特點 * A: Properties集合的特點 * a: Properties類介紹 * Propert...

    aboutU 評論0 收藏0

發表評論

0條評論

Youngs

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<