欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++之IO類,文件輸入輸出,string流練習(xí)題

 更新時間:2021年09月10日 09:12:52   作者:Bitdancing  
這篇文章主要介紹了C++實(shí)現(xiàn)IO類的幾道數(shù)組練習(xí)題,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

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

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

IO類

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

IO對象不能拷貝或賦值

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

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

條件狀態(tài)

狀態(tài) 解釋
strm:iostate 是一種機(jī)器無關(guān)的類型,提供了表達(dá)條件狀態(tài)的完整功能
strm:badbit 用來指出流已經(jīng)崩潰
strm:failbit 用來指出一個IO操作失敗了
strm:eofbit 用來指出流到達(dá)了文件結(jié)束
strm:goodbit 用來指出流未處于錯誤狀態(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中對應(yīng)的條件狀態(tài)位置位,返回void
s.rdstate() 返回流s的當(dāng)前條件狀態(tài),返回值類型為strm::iostate

上表中,strm是一種IO類型,(如istream), s是一個流對象。

管理輸出緩沖

  • 每個輸出流都管理一個緩沖區(qū),用來保存程序讀寫的數(shù)據(jù)。文本串可能立即打印出來,也可能被操作系統(tǒng)保存在緩沖區(qū)內(nèi),隨后再打印。
  • 刷新(即,數(shù)據(jù)真正寫到輸出設(shè)備或文件)緩沖區(qū)的IO操縱符
    • endl:輸出一個換行符并刷新緩沖區(qū)
    • flush:刷新流,但不添加任何字符
    • ends:在緩沖區(qū)插入空字符null,然后刷新
    • unitbuf:告訴流接下來每次操作之后都要進(jìn)行一次flush操作。
    • nounitbuf:回到正常的緩沖方式

文件輸入輸出

頭文件fstream定義了三個類型來支持文件IO:

  • ifstream從一個給定文件讀取數(shù)據(jù)。
  • ofstream向一個給定文件寫入數(shù)據(jù)。
  • fstream可以讀寫給定文件。

fstream特有的操作

操作 解釋
fstream fstrm; 創(chuàng)建一個未綁定的文件流。
fstream fstrm(s); 創(chuàng)建一個文件流,并打開名為s的文件,s可以是string也可以是char指針
fstream fstrm(s, mode); 與前一個構(gòu)造函數(shù)類似,但按指定mode打開文件
fstrm.open(s) 打開名為s的文件,并和fstrm綁定
fstrm.close() 關(guān)閉和fstrm綁定的文件
fstrm.is_open() 返回一個bool值,指出與fstrm關(guān)聯(lián)的文件是否成功打開且尚未關(guān)閉

上表中,fstream是頭文件fstream中定義的一個類型,fstrm是一個文件流對象。

文件模式

文件模式 解釋
in 以讀的方式打開
out 以寫的方式打開
app 每次寫操作前均定位到文件末尾
ate 打開文件后立即定位到文件末尾
trunc 截斷文件
binary 以二進(jìn)制方式進(jìn)行IO操作。

string流

頭文件sstream定義了三個類型來支持內(nèi)存IO:

  • istringstream從string讀取數(shù)據(jù)。
  • ostringstream向string寫入數(shù)據(jù)。
  • 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 <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
typedef struct PersonInfo
{
	string name;
	vector<string> phones;
}p;
int main() {
	string line, word;
	vector<p> 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í)1

編寫函數(shù),接受一個istream&參數(shù),返回值類型也是istream&。此函數(shù)須從給定流中讀取數(shù)據(jù),直至遇到文件結(jié)束標(biāo)識時停止。它將讀取的數(shù)據(jù)打印在標(biāo)準(zhǔn)輸出上。完成這些操作后,在返回流之前,對流進(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í)2

測試函數(shù),調(diào)用參數(shù)為cin。

解:

#include <iostream>
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 <iostream>
#include <string>
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í)3

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

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

如badbit、failbit、eofbit 的任一個被置位,那么檢測流狀態(tài)的條件會失敗。

練習(xí)4

編寫函數(shù),以讀模式打開一個文件,將其內(nèi)容讀入到一個string的vector中,將每一行作為一個獨(dú)立的元素存于vector中。

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
void ReadFileToVec(const string& filename, vector<string>& vec)
{
	ifstream ifs(filename);
	if (ifs)
	{
		string buf;
		while (getline(ifs, buf))
			vec.push_back(buf);
	}
}

練習(xí)5

重寫上面的程序,將每個單詞作為一個獨(dú)立的元素進(jìn)行存儲。

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

練習(xí)6

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

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
	//將來自一個文件的行保存到vector中
	ifstream ifs("hello.txt");
	if (!ifs)
	{
		cerr << "no data ?" << endl;
		return -1;
	}
	vector<string> 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;
}

練習(xí)7

本節(jié)的程序在外層while循環(huán)中定義了istringstream對象。如果record對象定義在循環(huán)之外,你需要對程序進(jìn)行怎樣的修改?重寫程序,將record的定義移到while循環(huán)之外,驗(yàn)證你設(shè)想的修改方法是否正確。

解:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using std::vector; using std::string; using std::cin; using std::istringstream;
struct PersonInfo {
    string name;
    vector<string> phones;
};
int main()
{
    string line, word;
    vector<PersonInfo> 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

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

解:

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

練習(xí)9

電話號碼程序

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
using namespace std;
struct PersonInfo {
	string name;
	vector<string> 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<PersonInfo> 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);
	}
	//逐個驗(yàn)證電話號碼 并 改變其格式
	for (const auto& entry : people)   //對people中的每一項(xiàng)
	{
		//每個循環(huán)創(chuàng)建的對象
		ostringstream formatted, badnums;
		//對每個數(shù)
		for (const auto& nums : entry.phones)
		{
			if (!valid(nums))
			{
				badnums << " " << nums;
				//將數(shù)的字符串形式存入badnums
			}
			else
			{
				//將格式化的字符串寫入formatted
				formatted << " " << format(nums);
			}
		}
		//沒有錯誤的數(shù)
		if (badnums.str().empty())
		{
			cout << entry.name << " "
				<< formatted.str() << endl;
		}
		else
		{
			//打印名字和錯誤的數(shù)
			cerr << "input error: " << entry.name
				<< " invalid number(s)" << badnums.str() << endl;
		}
	}
	return 0;
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 詳解C++何時需要拷貝構(gòu)造函數(shù)

    詳解C++何時需要拷貝構(gòu)造函數(shù)

    拷貝構(gòu)造函數(shù)是一個特殊的構(gòu)造函數(shù),用于創(chuàng)建一個新對象,該對象與另一個同類對象具有相同的屬性和值,在 C++ 中,拷貝構(gòu)造函數(shù)通常采用另一個同類對象作為參數(shù),并使用該對象初始化新對象,本文給大家講講何時需要拷貝函數(shù),需要的朋友可以參考下
    2023-09-09
  • 淺談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系

    淺談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系

    下面小編就為大家?guī)硪黄獪\談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系。小編覺得挺不錯的現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 打印菱形以及斐波納契數(shù)列的幾種解法介紹

    打印菱形以及斐波納契數(shù)列的幾種解法介紹

    本篇文章是對打印菱形及斐波納契數(shù)列的幾種解法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C++學(xué)習(xí)小結(jié)之?dāng)?shù)據(jù)類型及轉(zhuǎn)換方式

    C++學(xué)習(xí)小結(jié)之?dāng)?shù)據(jù)類型及轉(zhuǎn)換方式

    本文給大家分享的是本人在學(xué)習(xí)C++過程中的一個小心得,關(guān)于數(shù)據(jù)類型和轉(zhuǎn)換方式的,這里記錄下來,推薦給菜鳥們,高手大神請直接飄過。
    2015-07-07
  • 帶頭結(jié)點(diǎn)的鏈表的基本操作(超詳細(xì))

    帶頭結(jié)點(diǎn)的鏈表的基本操作(超詳細(xì))

    鏈表是一種動態(tài)分配空間的存儲結(jié)構(gòu),能更有效地利用存儲空間,通過對單鏈表基本操作的代碼實(shí)現(xiàn),我深刻領(lǐng)悟到以“指針”指示元素的后繼,在插入或刪除元素時不需要移動元素
    2023-07-07
  • C語言中如何實(shí)現(xiàn)單鏈表刪除指定結(jié)點(diǎn)

    C語言中如何實(shí)現(xiàn)單鏈表刪除指定結(jié)點(diǎn)

    這篇文章主要介紹了C語言中如何實(shí)現(xiàn)單鏈表刪除指定結(jié)點(diǎn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • MFC對話框中添加狀態(tài)欄的方法

    MFC對話框中添加狀態(tài)欄的方法

    這篇文章主要介紹了MFC對話框中添加狀態(tài)欄的方法,實(shí)例分析了MFC對話框添加狀態(tài)欄所涉及的相關(guān)成員變量與事件實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • STL各個容器性能詳細(xì)比較

    STL各個容器性能詳細(xì)比較

    從下面表中的數(shù)據(jù)來看寫入用時vector和deque很快,因?yàn)樗麄儍?nèi)存分配次數(shù)少,關(guān)聯(lián)容器和list都是一個一個分配的,一個一個分配也會造成內(nèi)存碎片,內(nèi)存利用率低
    2013-09-09
  • Python繪圖之詳解matplotlib

    Python繪圖之詳解matplotlib

    這篇文章主要介紹了Python繪圖之詳解matplotlib,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C/C++標(biāo)準(zhǔn)庫之轉(zhuǎn)換UTC時間到local本地時間詳解

    C/C++標(biāo)準(zhǔn)庫之轉(zhuǎn)換UTC時間到local本地時間詳解

    最近遇到一個問題:數(shù)據(jù)庫中存放的時間為UTC時間,但是現(xiàn)在要求都出來顯示的時間為本地時間,所以就用C++實(shí)現(xiàn)了,下面這篇文章主要給大家介紹了關(guān)于C/C++標(biāo)準(zhǔn)庫之轉(zhuǎn)換UTC時間到local本地時間的方法,還有C++中獲取UTC時間精確到微秒的實(shí)現(xiàn)代碼,需要的朋友可以參考下。
    2017-11-11

最新評論