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

C++類(lèi)型轉(zhuǎn)換和IO流操作處理教程

 更新時(shí)間:2023年08月01日 10:59:54   作者:一朵貓貓菇  
這篇文章主要給大家介紹了關(guān)于C++類(lèi)型轉(zhuǎn)換和IO流操作處理的相關(guān)資料,標(biāo)準(zhǔn)C++為了加強(qiáng)類(lèi)型轉(zhuǎn)換的可視性,引入了四種命名的強(qiáng)制類(lèi)型轉(zhuǎn)換操作符,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下

前言

首先我們看看C語(yǔ)言中的類(lèi)型轉(zhuǎn)換:

在 C 語(yǔ)言中,如果 賦值運(yùn)算符左右兩側(cè)類(lèi)型不同,或者形參與實(shí)參類(lèi)型不匹配,或者返回值類(lèi)型與 接收返回值類(lèi)型不一致時(shí),就需要發(fā)生類(lèi)型轉(zhuǎn)化 , C 語(yǔ)言中總共有兩種形式的類(lèi)型轉(zhuǎn)換: 隱式類(lèi)型 轉(zhuǎn)換和顯式類(lèi)型轉(zhuǎn)換

1. 隱式類(lèi)型轉(zhuǎn)化:編譯器在編譯階段自動(dòng)進(jìn)行,能轉(zhuǎn)就轉(zhuǎn),不能轉(zhuǎn)就編譯失敗

2. 顯式類(lèi)型轉(zhuǎn)化:需要用戶自己處理

int main()
{
	int i = 1;
	// 隱式類(lèi)型轉(zhuǎn)換
	double d = i;
	printf("%d, %.2f\n", i, d);
	int* p = &i;
	// 顯示的強(qiáng)制類(lèi)型轉(zhuǎn)換
	int address = (int)p;
	printf("%x, %d\n", p, address);
}

對(duì)于上面這種C語(yǔ)言的類(lèi)型轉(zhuǎn)換其實(shí)是有一些缺陷的,轉(zhuǎn)換的可視性比較差,所有的轉(zhuǎn)換形式都是以一種相同形式書(shū)寫(xiě),難以跟蹤錯(cuò)誤的轉(zhuǎn)換。

下面我們看看C++中對(duì)于類(lèi)型轉(zhuǎn)換的修改

一、C++的四種類(lèi)型轉(zhuǎn)換

為什么C++需要重新改進(jìn)類(lèi)型轉(zhuǎn)換呢?

C 風(fēng)格的轉(zhuǎn)換格式很簡(jiǎn)單,但是有不少缺點(diǎn)的:

1. 隱式類(lèi)型轉(zhuǎn)化有些情況下可能會(huì)出問(wèn)題:比如數(shù)據(jù)精度丟失

2. 顯式類(lèi)型轉(zhuǎn)換將所有情況混合在一起,代碼不夠清晰

因此 C++ 提出了自己的類(lèi)型轉(zhuǎn)化風(fēng)格,注意 因?yàn)?/strong> C++ 要兼容 C 語(yǔ)言,所以 C++ 中還可以使用 C 語(yǔ)言的 轉(zhuǎn)化風(fēng)格

標(biāo)準(zhǔn) C++ 為了加強(qiáng)類(lèi)型轉(zhuǎn)換的可視性,引入了四種命名的強(qiáng)制類(lèi)型轉(zhuǎn)換操作符:

static_cast reinterpret_cast 、 const_cast dynamic_cast

第一種:static_cast

static_cast 用于非多態(tài)類(lèi)型的轉(zhuǎn)換(靜態(tài)轉(zhuǎn)換),編譯器隱式執(zhí)行的任何類(lèi)型轉(zhuǎn)換都可用

static_cast ,但它不能用于兩個(gè)不相關(guān)的類(lèi)型進(jìn)行轉(zhuǎn)換

下面我們用代碼演示一下:

int main()
{
	int i = 1;
	double d = static_cast<double>(i);
	float c = static_cast<float>(d);
	return 0;
}

我們只需要記?。簊tatic_cast適用于可以隱式轉(zhuǎn)換的類(lèi)型。

第二種:reinterpret_cast

reinterpret_cast 操作符通常為操作數(shù)的位模式提供較低層次的重新解釋?zhuān)糜趯⒁环N類(lèi)型轉(zhuǎn)換 為另一種不同的類(lèi)型 。

下面我們用代碼演示一下:

int main()
{
	int i = 1;
	int* p = &i;
	int t = reinterpret_cast<int>(p);
	cout << t << endl;
	int c = 10;
	int* d = reinterpret_cast<int*>(c);
	cout << d << endl;
	return 0;
}

 對(duì)于reinterpret_cast的使用我們只需要記住適用于不同類(lèi)型之間的轉(zhuǎn)換即可。

第三種:const_cast

const_cast 最常用的用途就是刪除變量的 const 屬性,方便賦值.

int main()
{
	const int a = 2;
	int* p = const_cast<int*>(&a);
	cout << *p << endl;
	*p = 10;
	cout << *p << endl;
	return 0;
}

對(duì)于const類(lèi)型的常變量一般是不能直接修改的,但是可以像我們上面那樣間接的修改,主要還是因?yàn)槌W兞渴欠旁跅V械牟皇欠旁诔A繀^(qū)的,注意:常量區(qū)是一定不可以修改的。

下面我們看一道常考的題:

int main()
{
	const int a = 2;
	int* p = const_cast<int*>(&a);
	*p = 3;
	cout << a << endl;
	cout << *p << endl;
	return 0;
}

 上面這段代碼的運(yùn)行結(jié)果是什么?很多人都會(huì)以為是3和3,因?yàn)閜指向a的空間,修改*p那么a中的內(nèi)容也會(huì)被修改,思路沒(méi)錯(cuò),但是沒(méi)有考慮到編譯器的優(yōu)化,這道題的正確答案是2 3。

由于const變量在編譯器看來(lái)是不會(huì)被修改的,所以本來(lái)應(yīng)該先從內(nèi)存讀數(shù)據(jù)到寄存器結(jié)果被編譯器優(yōu)化為直接從寄存器拿數(shù)據(jù)。對(duì)于這種情況我們只需要讓編譯器不優(yōu)化,這樣的話編譯器就會(huì)從內(nèi)存中讀取a的內(nèi)容打印了:

 可以看到這次的結(jié)果就正確了。所以對(duì)于const_cast轉(zhuǎn)化是將原本const屬性去掉單獨(dú)分出來(lái),這個(gè)時(shí)候我們就應(yīng)該小心了,const變量盡量不要去改變。

第四種:dynamic_cast

dynamic_cast 用于將一個(gè)父類(lèi)對(duì)象的指針 / 引用轉(zhuǎn)換為子類(lèi)對(duì)象的指針或引用 ( 動(dòng)態(tài)轉(zhuǎn)換 )

向上轉(zhuǎn)型:子類(lèi)對(duì)象指針 / 引用 -> 父類(lèi)指針 / 引用 ( 不需要轉(zhuǎn)換,賦值兼容規(guī)則 )

向下轉(zhuǎn)型:父類(lèi)對(duì)象指針 / 引用 -> 子類(lèi)指針 / 引用 ( dynamic_cast 轉(zhuǎn)型是安全的 )

注意:

1. dynamic_cast 只能用于父類(lèi)含有虛函數(shù)的類(lèi)

2. dynamic_cast 會(huì)先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回 0

 我們可以看到父類(lèi)指針是天然可以接收子類(lèi)的指針或者引用的,那么如果是將父類(lèi)給子類(lèi)呢?

 可以看到如果我們不加類(lèi)型轉(zhuǎn)化的話連編譯都過(guò)不了,那么我們用類(lèi)型轉(zhuǎn)換再試試:

 可以看到經(jīng)過(guò)類(lèi)型轉(zhuǎn)換后是沒(méi)問(wèn)題的,并且dynamic_cast在轉(zhuǎn)換中會(huì)保證安全性。下面我們看看如果不用dynamic_cast轉(zhuǎn)化會(huì)出現(xiàn)什么情況:

class A
{
public:
	virtual void f() {}
	int _a = 0;
};
class B : public A
{
public:
	int _b = 0;
};
void Func(A* ptr)
{
	B* btr = (B*)ptr;
	cout << btr << endl;
	btr->_a++;
	btr->_b++;
	cout << btr->_a << endl;
	cout << btr->_b << endl;
}
int main()
{
	A aa;
	B bb;
	Func(&aa);
	Func(&bb);
	return 0;
}

 我們可以看到直接出錯(cuò)了,下面我們用安全轉(zhuǎn)換試一下:

我們可以看到當(dāng)子類(lèi)接收父類(lèi)指針造成越界的時(shí)候安全轉(zhuǎn)化會(huì)檢查能否成功轉(zhuǎn)化,對(duì)于不能成功轉(zhuǎn)化的直接返回0就像上圖一樣。

總結(jié):

Func中的ptr如果是指向子類(lèi)對(duì)象,那么轉(zhuǎn)回子類(lèi)類(lèi)型是沒(méi)問(wèn)題的。 

ptr如果是指向父類(lèi)對(duì)象,那么轉(zhuǎn)回子類(lèi)類(lèi)型是存在越界風(fēng)險(xiǎn)的。

注意 強(qiáng)制類(lèi)型轉(zhuǎn)換關(guān)閉或掛起了正常的類(lèi)型檢查 ,每次使用強(qiáng)制類(lèi)型轉(zhuǎn)換前,程序員應(yīng)該仔細(xì)考慮是 否還有其他不同的方法達(dá)到同一目的,如果非強(qiáng)制類(lèi)型轉(zhuǎn)換不可,則應(yīng)限制強(qiáng)制轉(zhuǎn)換值的作用 域,以減少發(fā)生錯(cuò)誤的機(jī)會(huì)。 強(qiáng)烈建議:避免使用強(qiáng)制類(lèi)型轉(zhuǎn)換

以上就是C++類(lèi)型轉(zhuǎn)換的全部?jī)?nèi)容了,下面我們進(jìn)入IO流的學(xué)習(xí)。

二、C++IO流

C 語(yǔ)言的輸入與輸出:

C 語(yǔ)言中我們用到的最頻繁的輸入輸出方式就是 scanf () printf()scanf(): 從標(biāo)準(zhǔn)輸入設(shè)備 ( 盤(pán) ) 讀取數(shù)據(jù),并將值存放在變量中 。 printf(): 將指定的文字 / 字符串輸出到標(biāo)準(zhǔn)輸出設(shè)備 ( 屏幕 ) 。 注意寬度輸出和精度輸出控制。

 語(yǔ)言借助了相應(yīng)的緩沖區(qū)來(lái)進(jìn)行輸入與輸出。

對(duì) 輸入輸出緩沖區(qū) 的理解:

1. 可以 屏蔽掉低級(jí) I/O 的實(shí)現(xiàn) ,低級(jí) I/O 的實(shí)現(xiàn)依賴操作系統(tǒng)本身內(nèi)核的實(shí)現(xiàn),所以如果能夠屏 蔽這部分的差異,可以 很容易寫(xiě)出可移植的程序 。

2. 可以 使用這部分的內(nèi)容實(shí)現(xiàn) 讀取的行為 ,對(duì)于計(jì)算機(jī)而言是沒(méi)有 “ 行 ” 這個(gè)概念,有了這 部分,就可以定義 “ 行 ” 的概念,然后解析緩沖區(qū)的內(nèi)容,返回一個(gè) “ 行 ” 。

流是什么:

流 ” 即是流動(dòng)的意思,是物質(zhì)從一處向另一處流動(dòng)的過(guò)程 ,是對(duì)一種 有序連續(xù) 具有方向性 數(shù) 據(jù) 其單位可以是bit,byte,packet )的 抽象描述。 C++ 流是指信息從外部輸入設(shè)備(如鍵盤(pán))向計(jì)算機(jī)內(nèi)部(如內(nèi)存)輸入和從內(nèi)存向外部輸出設(shè) 備(顯示器)輸出的過(guò)程。這種輸入輸出的過(guò)程被形象的比喻為 “ 流 ” 。

它的 特性 是: 有序連續(xù)具有方向性 為了實(shí)現(xiàn)這種流動(dòng), C++ 定義了 I/O 標(biāo)準(zhǔn)類(lèi)庫(kù),這些每個(gè)類(lèi)都稱為流 / 流類(lèi),用以完成某方面的功 能。 C++IO流: C++ 系統(tǒng)實(shí)現(xiàn)了一個(gè)龐大的類(lèi)庫(kù),其中 ios 為基類(lèi),其他類(lèi)都是直接或間接派生自 ios 類(lèi)。

 C++標(biāo)準(zhǔn)IO

C++ 標(biāo)準(zhǔn)庫(kù)提供了 4 個(gè)全局流對(duì)象 cin 、 cout 、 cerr 、 clog ,使用 cout 進(jìn)行標(biāo)準(zhǔn)輸出,即數(shù)據(jù)從內(nèi) 存流向控制臺(tái) ( 顯示器 ) 。使用 cin 進(jìn)行標(biāo)準(zhǔn)輸入即數(shù)據(jù)通過(guò)鍵盤(pán)輸入到程序中 ,同時(shí) C++ 標(biāo)準(zhǔn)庫(kù)還 提供了 cerr 用來(lái)進(jìn)行標(biāo)準(zhǔn)錯(cuò)誤的輸出 ,以及 clog 進(jìn)行日志的輸出 ,從上圖可以看出, cout 、 cerr 、 clog 是 ostream 類(lèi)的三個(gè)不同的對(duì)象,因此這三個(gè)對(duì)象現(xiàn)在基本沒(méi)有區(qū)別,只是應(yīng)用場(chǎng)景不 同。

在使用時(shí)候必須要包含文件并引入 std 標(biāo)準(zhǔn)命名空間。

注意:

1. cin 為緩沖流。 鍵盤(pán)輸入的數(shù)據(jù)保存在緩沖區(qū)中,當(dāng)要提取時(shí),是從緩沖區(qū)中拿 。如果一次輸 入過(guò)多,會(huì)留在那兒慢慢用, 如果輸入錯(cuò)了,必須在回車(chē)之前修改,如果回車(chē)鍵按下就無(wú)法 挽回了只有把輸入緩沖區(qū)中的數(shù)據(jù)取完后,才要求輸入新的數(shù)據(jù)

2. 輸入的數(shù)據(jù)類(lèi)型必須與要提取的數(shù)據(jù)類(lèi)型一致 ,否則出錯(cuò)。出錯(cuò)只是在流的狀態(tài)字 state 中對(duì) 應(yīng)位置位(置 1 ),程序繼續(xù)。

3. 空格和回車(chē)都可以作為數(shù)據(jù)之間的分格符,所以多個(gè)數(shù)據(jù)可以在一行輸入,也可以分行輸 入。但如果是 字符型和字符串,則空格( ASCII 碼為 32 )無(wú)法用 cin 輸入,字符串中也不能有 空格 ?;剀?chē)符也無(wú)法讀入。

4. cin 和 cout 可以直接輸入和輸出內(nèi)置類(lèi)型數(shù)據(jù),原因: 標(biāo)準(zhǔn)庫(kù)已經(jīng)將所有內(nèi)置類(lèi)型的輸入和 輸出全部重載了 :

下面我們看看OJ中的循環(huán)輸入:

int main()
{
	string str;
	while (cin >> str)
	{
		cout << str << endl;
	}
	return 0;
}

不知道我們是否會(huì)有疑問(wèn)>>符號(hào)是如何像邏輯判斷操作符那樣在循環(huán)體中進(jìn)行判斷的呢?

 我們可以看到>>符號(hào)的返回值是istream&,也不是bool類(lèi)型,下面我們看文檔:

 其實(shí)在文檔中我們發(fā)現(xiàn)不管是C++11還是C++98都重載了operator bool,重載的目的就是支持自定義類(lèi)型隱式轉(zhuǎn)換為自定義類(lèi)型,也就是說(shuō)支持將istream&轉(zhuǎn)化為bool類(lèi)型。當(dāng)然其實(shí)日常使用中我們看到最多的是內(nèi)置類(lèi)型隱式轉(zhuǎn)換成自定義類(lèi)型,比如下面這樣:

class A
{
public:
	A(int a)
		:_a1(1)
		, _a2(2)
	{}
private:
	int _a1;
	int _a2;
};
int main()
{
	A aa = 1;
	return 0;
}

 上圖中我們的aa就是自定義類(lèi)型,1是內(nèi)置類(lèi)型,將1給aa的過(guò)程中發(fā)生了隱式類(lèi)型轉(zhuǎn)化,由內(nèi)置類(lèi)型轉(zhuǎn)化為自定義類(lèi)型。

 上圖中我們可以看到,正常情況下我們是不能將自定義類(lèi)型轉(zhuǎn)化為內(nèi)置類(lèi)型的,但是當(dāng)我們重載了int的轉(zhuǎn)換后就可以了:

    operator int()
	{
		return _a1 + _a2;
	}

 下面我們將日期類(lèi)實(shí)現(xiàn)為像>>一樣可以判斷的:

class Date
{
	friend ostream& operator << (ostream& out, const Date& d);
	friend istream& operator >> (istream& in, Date& d);
public:
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{}
	operator bool()
	{
		if (_year > 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
private:
	int _year;
	int _month;
	int _day;
};
istream& operator >> (istream& in, Date& d)
{
	in >> d._year >> d._month >> d._day;
	return in;
}
ostream& operator << (ostream& out, const Date& d)
{
	out << d._year << " " << d._month << " " << d._day;
	return out;
}
int main()
{
	Date d1(0, 5, 30);
	while (d1)
	{
		cout << d1 << endl;
	}
	return 0;
}

我們重載bool類(lèi)型的時(shí)候直接用year做判斷了這里只是為了演示,對(duì)于年份為0的日期進(jìn)入while循環(huán)后會(huì)直接退出,如果是年份非0的日期則會(huì)死循環(huán)的打印。

C++文件IO流:

C++ 根據(jù)文件內(nèi)容的數(shù)據(jù)格式分為 二進(jìn)制文件文本文件 。采用文件流對(duì)象操作文件的一般步驟:

1. 定義一個(gè)文件流對(duì)象 ifstream ififile( 只輸入用 ) ofstream ofifile( 只輸出用 ) fstream iofifile( 既輸入又輸出用 )

2. 使用文件流對(duì)象的成員函數(shù)打開(kāi)一個(gè)磁盤(pán)文件,使得文件流對(duì)象和磁盤(pán)文件之間建立聯(lián)系

3. 使用提取和插入運(yùn)算符對(duì)文件進(jìn)行讀寫(xiě)操作,或使用成員函數(shù)進(jìn)行讀寫(xiě)

4. 關(guān)閉文件

struct ServerInfo
{
 char _address[32];
 int _port;
 Date _date;
};
struct ConfigManager
{
public:
 ConfigManager(const char* filename)
 :_filename(filename)
 {}
 void WriteBin(const ServerInfo& info)
 {
 ofstream ofs(_filename, ios_base::out | ios_base::binary);
 ofs.write((const char*)&info, sizeof(info));
 }
 void ReadBin(ServerInfo& info)
 {
 ifstream ifs(_filename, ios_base::in | ios_base::binary);
 ifs.read((char*)&info, sizeof(info));
 }
 void WriteText(const ServerInfo& info)
 {
 ofstream ofs(_filename);
 ofs << info._address << " " << info._port<< " "<<info._date;
 }
 void ReadText(ServerInfo& info)
 {
 ifstream ifs(_filename);
 ifs >> info._address >> info._port>>info._date;
 }
private:
 string _filename; // 配置文件
};

上面是一個(gè)文件管理的類(lèi),里面封裝了二進(jìn)制讀寫(xiě)和文本讀寫(xiě)的接口,由于C++IO流屬于了解性的內(nèi)容所以我們就不再詳細(xì)的講解每個(gè)函數(shù),有不會(huì)的接口大家自行查文檔即可。下面我們用一個(gè)實(shí)例使用一下以上的接口:

int main()
{
 ServerInfo winfo = { "192.0.0.1", 80, { 2022, 4, 10 } };
    // 二進(jìn)制讀寫(xiě)
 ConfigManager cf_bin("test.bin");
 cf_bin.WriteBin(winfo);
 ServerInfo rbinfo;
 cf_bin.ReadBin(rbinfo);
 cout << rbinfo._address << " " << rbinfo._port <<" "
<<rbinfo._date << endl;
    // 文本讀寫(xiě)
 ConfigManager cf_text("test.text");
 cf_text.WriteText(winfo);
 ServerInfo rtinfo;
 cf_text.ReadText(rtinfo);
 cout << rtinfo._address << " " << rtinfo._port << " " <<
rtinfo._date << endl;
 return 0;
}

C++ 文件流的優(yōu)勢(shì)就是可以對(duì)內(nèi)置類(lèi)型和自定義類(lèi)型,都使用 一樣的方式,去流插入和流提取數(shù)據(jù),當(dāng)然這里自定義類(lèi)型Date 需要重載 >> 和 << 。

istream& operator >> (istream& in, Date& d)

ostream& operator << (ostream& out, const Date& d)

stringstream 的簡(jiǎn)單介紹

在 C 語(yǔ)言中,如果想要將一個(gè)整形變量的數(shù)據(jù)轉(zhuǎn)化為字符串格式,如何去做?

1. 使用 itoa() 函數(shù)

2. 使用 sprintf() 函數(shù)

但是兩個(gè)函數(shù)在轉(zhuǎn)化時(shí),都得 需要先給出保存結(jié)果的空間 ,那空間要給多大呢,就不太好界定, 而且 轉(zhuǎn)化格式不匹配時(shí),可能還會(huì)得到錯(cuò)誤的結(jié)果甚至程序崩潰 。

在 C++ 中,可以使用 stringstream 類(lèi)對(duì)象來(lái)避開(kāi)此問(wèn)題。

在程序中如果想要使用 stringstream ,必須要包含頭文件

在該頭文件下,標(biāo)準(zhǔn)庫(kù)三個(gè)類(lèi): istringstream 、 ostringstream 和 stringstream ,分別用來(lái)進(jìn)行流的輸入、輸出和輸入輸出操 作,下面主要介紹 stringstream 。

stringstream 主要可以用來(lái):

1. 將數(shù)值類(lèi)型數(shù)據(jù)格式化為字符串

#include<sstream>
int main()
{
 int a = 12345678;
 string sa;
 // 將一個(gè)整形變量轉(zhuǎn)化為字符串,存儲(chǔ)到string類(lèi)對(duì)象中
 stringstream s;
 s << a;
 s >> sa;
    // clear()
    // 注意多次轉(zhuǎn)換時(shí),必須使用clear將上次轉(zhuǎn)換狀態(tài)清空掉
    // stringstreams在轉(zhuǎn)換結(jié)尾時(shí)(即最后一個(gè)轉(zhuǎn)換后),會(huì)將其內(nèi)部狀態(tài)設(shè)置為badbit
    // 因此下一次轉(zhuǎn)換是必須調(diào)用clear()將狀態(tài)重置為goodbit才可以轉(zhuǎn)換
    // 但是clear()不會(huì)將stringstreams底層字符串清空掉
    // s.str("");
 // 將stringstream底層管理string對(duì)象設(shè)置成"", 
 // 否則多次轉(zhuǎn)換時(shí),會(huì)將結(jié)果全部累積在底層string對(duì)象中
 s.str("");
 s.clear();   // 清空s, 不清空會(huì)轉(zhuǎn)化失敗
 double d = 12.34;
 s << d;
 s >> sa;
 string sValue;
 sValue = s.str();   // str()方法:返回stringsteam中管理的string類(lèi)型
 cout << sValue << endl; 
 return 0;
}

2. 字符串拼接

int main()
{
 stringstream sstream;
 // 將多個(gè)字符串放入 sstream 中
 sstream << "first" << " " << "string,";
 sstream << " second string";
 cout << "strResult is: " << sstream.str() << endl;
 // 清空 sstream
 sstream.str("");
 sstream << "third string";
 cout << "After clear, strResult is: " << sstream.str() << endl;
 return 0;
}

3. 序列化和反序列化結(jié)構(gòu)數(shù)據(jù)

struct ChatInfo
{
 string _name; // 名字
 int _id;      // id
 Date _date;   // 時(shí)間
 string _msg;  // 聊天信息
};
int main()
{
 // 結(jié)構(gòu)信息序列化為字符串
 ChatInfo winfo = { "張三", 135246, { 2022, 4, 10 }, "晚上一起看電影吧"
};
 ostringstream oss;
 oss << winfo._name << " " << winfo._id << " " << winfo._date << " "
<< winfo._msg;
 string str = oss.str();
 cout << str << endl<<endl;
 // 我們通過(guò)網(wǎng)絡(luò)這個(gè)字符串發(fā)送給對(duì)象,實(shí)際開(kāi)發(fā)中,信息相對(duì)更復(fù)雜,
    // 一般會(huì)選用Json、xml等方式進(jìn)行更好的支持
 // 字符串解析成結(jié)構(gòu)信息
 ChatInfo rInfo;
 istringstream iss(str);
 iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;
 cout << "-------------------------------------------------------"
<< endl;
 cout << "姓名:" << rInfo._name << "(" << rInfo._id << ") ";
 cout <<rInfo._date << endl;
 cout << rInfo._name << ":>" << rInfo._msg << endl;
 cout << "-------------------------------------------------------"
<< endl;
 return 0;
}

注意:

1. stringstream 實(shí)際是在其底層維護(hù)了一個(gè) string 類(lèi)型的對(duì)象用來(lái)保存結(jié)果 。

2. 多次數(shù)據(jù)類(lèi)型轉(zhuǎn)化時(shí),一定要用 clear() 來(lái)清空,才能正確轉(zhuǎn)化 ,但 clear() 不會(huì)將 stringstream 底層的 string 對(duì)象清空。

3. 可以 使用 s. str("") 方法將底層 string 對(duì)象設(shè)置為 "" 空字符串 。

4. 可以 使用 s.str() 將讓 stringstream 返回其底層的 string 對(duì)象 。

5. stringstream 使用 string 類(lèi)對(duì)象代替字符數(shù)組,可以避免緩沖區(qū)溢出的危險(xiǎn),而且其會(huì)對(duì)參 數(shù)類(lèi)型進(jìn)行推演,不需要格式化控制,也不會(huì)出現(xiàn)格式化失敗的風(fēng)險(xiǎn) ,因此使用更方便,更 安全。

總結(jié)

C++IO流這部分知識(shí)大多都是偏了解性的知識(shí),所以我們沒(méi)有在細(xì)細(xì)的講解,實(shí)際上學(xué)到這一部分很多人對(duì)C++都基本入門(mén)了,這個(gè)時(shí)候是完全有能力通過(guò)官方文檔來(lái)自己運(yùn)用這部分內(nèi)容。

到此這篇關(guān)于C++類(lèi)型轉(zhuǎn)換和IO流操作處理的文章就介紹到這了,更多相關(guān)C++類(lèi)型轉(zhuǎn)換和IO流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一元多項(xiàng)式加法運(yùn)算

    一元多項(xiàng)式加法運(yùn)算

    今天小編就為大家分享一篇關(guān)于一元多項(xiàng)式加法運(yùn)算,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • C語(yǔ)言版三子棋游戲

    C語(yǔ)言版三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++通過(guò)boost.date_time進(jìn)行時(shí)間運(yùn)算

    C++通過(guò)boost.date_time進(jìn)行時(shí)間運(yùn)算

    這篇文章介紹了C++通過(guò)boost.date_time進(jìn)行時(shí)間運(yùn)算的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C++中的QCommandLineParser簡(jiǎn)介

    C++中的QCommandLineParser簡(jiǎn)介

    這篇文章主要介紹了QCommandLineParser是Qt框架中的一個(gè)類(lèi),用于簡(jiǎn)化命令行參數(shù)的解析和處理,它支持定義命令行選項(xiàng)、解析參數(shù)、驗(yàn)證輸入有效性,并自動(dòng)生成幫助文本,適用于各種需要命令行輸入的應(yīng)用程序
    2024-09-09
  • C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例

    C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例

    這篇文章主要介紹了C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例,并且轉(zhuǎn)換后會(huì)統(tǒng)計(jì)二進(jìn)制1的個(gè)數(shù),實(shí)例簡(jiǎn)單明了,需要的朋友可以參考下
    2014-06-06
  • C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲(單人版)

    C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲(單人版)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲單人版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C++?vector的常見(jiàn)用法超詳細(xì)講解

    C++?vector的常見(jiàn)用法超詳細(xì)講解

    這篇文章主要介紹了C++?vector的常見(jiàn)用法,包括C++中vector容器的定義、初始化方法、訪問(wèn)元素、常用函數(shù)及其時(shí)間復(fù)雜度,通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • C++?protobuf中對(duì)不同消息內(nèi)容進(jìn)行賦值的方式總結(jié)(set_、set_allocated_、mutable_、add_)

    C++?protobuf中對(duì)不同消息內(nèi)容進(jìn)行賦值的方式總結(jié)(set_、set_allocated_、mutable_、

    這篇文章主要給大家介紹了關(guān)于C++?protobuf中對(duì)不同消息內(nèi)容進(jìn)行賦值的方式總結(jié),主要使用的是set_、set_allocated_、mutable_、add_,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • C語(yǔ)言利用棧實(shí)現(xiàn)對(duì)后綴表達(dá)式的求解

    C語(yǔ)言利用棧實(shí)現(xiàn)對(duì)后綴表達(dá)式的求解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言利用棧實(shí)現(xiàn)對(duì)后綴表達(dá)式的求解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++關(guān)于樹(shù)的定義全面梳理

    C++關(guān)于樹(shù)的定義全面梳理

    樹(shù)是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹(shù)中稱為結(jié)點(diǎn))按分支關(guān)系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹(shù)那樣。樹(shù)結(jié)構(gòu)在客觀世界中廣泛存在,如人類(lèi)社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹(shù)形象表示,本篇介紹二叉樹(shù)的遞歸與非遞歸遍歷的方法
    2022-06-06

最新評(píng)論