亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++IO流之fstream,?stringstream使用小結(jié)

 更新時(shí)間:2022年04月13日 10:09:30   作者:AKA你的閨蜜  
C語(yǔ)言中常用的輸入輸出函數(shù)有如下幾種:前者是格式化標(biāo)準(zhǔn)輸入輸出,后者是格式化文件輸入輸出,最后是格式化字符串輸入輸出,這篇文章主要介紹了C++IO流:fstream,?stringstream總結(jié),需要的朋友可以參考下

IO流

1. C語(yǔ)言IO

C語(yǔ)言中常用的輸入輸出函數(shù)有如下幾種:前者是格式化標(biāo)準(zhǔn)輸入輸出,后者是格式化文件輸入輸出,最后是格式化字符串輸入輸出。

函數(shù)名內(nèi)容備注
scanf標(biāo)準(zhǔn)輸入流(鍵盤(pán))讀取格式化的數(shù)據(jù)省略standard
fscanf所有輸入流讀取讀取格式化數(shù)據(jù)f:file
sscanf字符串中讀取格式化的數(shù)據(jù)s:string
printf將格式化的數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出流(屏幕)上省略standard
fprintf將格式化數(shù)據(jù)輸出到所有輸出流f:file
sprintf將格式化的數(shù)據(jù)輸出到字符串s:string

文件的輸入輸出需要以下幾個(gè)函數(shù):

函數(shù)名功能適用范圍
fopen打開(kāi)文件流文件
fclose關(guān)閉文件流文件
fscanf所有輸入流讀取讀取格式化數(shù)據(jù)文件
fprintf將格式化數(shù)據(jù)輸出到所有輸出流文件
fread二進(jìn)制輸入文件
fwrite二進(jìn)制輸出文件
//文件開(kāi)關(guān)
FILE* fopen   (const char* filename, const char* mode);
int   fclose  (FILE* stream);
//格式化讀寫(xiě)
int fprintf (FILE* stream, const char* format [, argument ]...);
int fscanf  (FILE* stream, const char* format [, argument ]...);
//二進(jìn)制讀寫(xiě)
size_t fwrite  (const void* buffer, size_t size, size_t count, FILE* stream);
size_t fread   (      void* buffer, size_t size, size_t count, FILE* stream);

使用方式如下:

struct ServerInfo 
{
	char _ip[32];
	int _port;
	friend ostream& operator<<(ostream& os, ServerInfo& info);
	friend ostream& operator>>(ostream& os, ServerInfo& info);
};
//測(cè)試C語(yǔ)言二進(jìn)制讀寫(xiě)
void TestC_Write_Bin() {
	ServerInfo info = { "192.168.1.1",80 };
	FILE* fout = fopen("info.bin", "wb");
    //assert();
	fwrite(&info, sizeof(ServerInfo), 1, fout);
	fclose(fout);
}
void TestC_Read_Bin() {
	ServerInfo info;
	FILE* fin = fopen("info.bin", "rb");
	fread(&info, sizeof(ServerInfo), 1, fin);
	printf("%s:%d", info._ip, info._port);
	fclose(fin);
}
//測(cè)試C語(yǔ)言字符讀寫(xiě)
void TestC_Write_Text() {
	ServerInfo info = { "192.168.1.1",80 };
	FILE* fout = fopen("info.txt", "w");
	fprintf(fout, "%s %d", info._ip, info._port);
	fclose(fout);
}
void TestC_Read_Text() {
	ServerInfo info;
	FILE* fin = fopen("info.txt", "r");
	fscanf(fin, "%s %d", &info._ip, &info._port);
	printf("%s:%d", info._ip, info._port);
}

2. C++IO

C++ 標(biāo)準(zhǔn)庫(kù)提供了4個(gè)全局流對(duì)象cin、coutcerr、clog。cout、cerr、clog 是 ostream 類(lèi)的三個(gè)不同的對(duì)象。使用 cout 進(jìn)行標(biāo)準(zhǔn)輸出,使用 cin 進(jìn)行標(biāo)準(zhǔn)輸入。同時(shí) C++ 標(biāo)準(zhǔn)庫(kù)還提供了 cerr 用來(lái)進(jìn)行標(biāo)準(zhǔn)錯(cuò)誤的輸出,以及 clog 進(jìn)行日志的輸出。

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

cout,cinostream,istream類(lèi)的對(duì)象,operator<<,operator>>分別是兩個(gè)對(duì)象的操作符重載成員函數(shù)。

C++輸出輸入可直接使用cout>>cin>>,因?yàn)槠渲剌d了所有內(nèi)置類(lèi)型,對(duì)于自定義類(lèi)型需要自行重載操作符>><<。

cin >> a >> b;

operator<<operator>>的返回值也是ostream&istream&,因此支持連續(xù)輸入輸出,又是一次函數(shù)調(diào)用。

cout/cin 取代 printf/scanf 的真正原因是 cout/cin 支持自定義類(lèi)型,符合面向?qū)ο蟮乃枷搿?/p>

當(dāng)需要循環(huán)讀入數(shù)據(jù)時(shí),可以采用如下的方式:

string str;
while (cin >> str) {
	;
}

從文檔中可以看到,operator>>的返回值是istream類(lèi)型,這個(gè)對(duì)象類(lèi)型是如何作真假判斷的呢?

原因是istream類(lèi)的對(duì)象支持一個(gè)操作符的重載函數(shù)叫operator bool,C++98中叫operator void*,C++11中叫operator bool

這是個(gè)特殊的運(yùn)算符重載函數(shù),該函數(shù)不允許限定返回類(lèi)型,當(dāng)類(lèi)型被當(dāng)作條件判斷時(shí),自動(dòng)調(diào)用并將返回值強(qiáng)轉(zhuǎn)為內(nèi)置的標(biāo)識(shí),該標(biāo)識(shí)如果為真就繼續(xù),如果為假就停止讀取。

2.2 C++文件IO流

采用面向?qū)ο蟮乃枷?,C++中文件指針被文件輸入輸出流對(duì)象ofstreamifstream代替。

fopen的調(diào)用方式類(lèi)似,創(chuàng)建輸入輸出流對(duì)象,調(diào)用其構(gòu)造函數(shù)傳入文件地址以及打開(kāi)模式。fclose被析構(gòu)函數(shù)代替,且析構(gòu)函數(shù)可以自動(dòng)調(diào)用。

對(duì)象構(gòu)造函數(shù)解釋
ofstream (const char fileName, ios_base::openmode mode=ios_base::out)*創(chuàng)建輸出流對(duì)象,并指定文件地址和打開(kāi)模式
ifstream (const char fileName, ios_base::openmode mode=ios_base::in)*創(chuàng)建輸入流對(duì)象,并指定文件地址

打開(kāi)模式變量的類(lèi)型是ios_base::openmode,該變量有如下幾個(gè)特定的值:

模式解釋
in文件讀取模式
out文件寫(xiě)入模式
binary二進(jìn)制文件模式
 

常用的有如上幾種,該變量的值以二進(jìn)制位中的不同位為1來(lái)標(biāo)識(shí),也就是說(shuō)使用異或|就可以組合起來(lái)用。

函數(shù)解釋
istream& read(char s, streamsize n);*read接口是輸入流istream對(duì)象的成員函數(shù),參數(shù)是變量和大小。
ostream& write(const char s , streamsize n);*write接口是輸出流ostream對(duì)象的成員函數(shù),參數(shù)是寫(xiě)入變量和寫(xiě)入大小。

示例

使用一個(gè)ConfigManage類(lèi)來(lái)演示幾種文件讀寫(xiě)的方式。

struct ServerInfo 
{
	char _ip[32];
	int _port;
	friend ostream& operator<<(ostream& os, ServerInfo& info);
	friend ostream& operator>>(ostream& os, ServerInfo& info);
};
class ConfigManage {
public:
	ConfigManage(const char* fileName)
		:_fileName(fileName)
	{}
    //二進(jìn)制寫(xiě)入
	void WriteBin(ServerInfo& info)
	{
		ofstream ofs(_fileName.c_str(), ios_base::out | ios_base::binary); //創(chuàng)建輸出流對(duì)象
		ofs.write((const char*)&info, sizeof(ServerInfo)); //調(diào)用write接口
	}
    //二進(jìn)制讀取
	void ReadBin(ServerInfo& info)
	{
		ifstream ifs(_fileName.c_str(), ios_base::in | ios_base::binary);
		ifs.read((char*)&info, sizeof(ServerInfo));
		cout << info << endl;
	}
private:
	string _fileName;
};

讀寫(xiě)文件更常用的方式是以文本形式讀寫(xiě),因此就可以省略打開(kāi)模式參數(shù)。

ifstream,ofstream文件輸入輸出類(lèi)中還繼承了iostream的流插入<<流提取>>操作符,也就是對(duì)象ofsifs也可以使用<<>>操作符。

struct ServerInfo {
	friend ostream& operator<<(ostream& os, ServerInfo& info);
	friend ostream& operator>>(ostream& os, ServerInfo& info);
    char _ip[32];
	int _port;
};
ostream& operator<<(ostream& os, ServerInfo& info) {
	os << info._ip << " " << info._port;
	return os;
}
istream& operator>>(istream& is, ServerInfo& info) {
	is >> info._ip >> info._port;
	return is;
}
//文本寫(xiě)入
void WriteText(ServerInfo& info)
{
    ofstream ofs(_fileName.c_str());
    //write
    ofs.write((const char*)&info, sizeof(ServerInfo));
    //1.
    ofs << info._ip << info._port; //對(duì)象未重載<<
	//2.
    ofs << info; //對(duì)象已重載>>
}
//文本讀取
void ReadText(ServerInfo& info)
{
    ifstream ifs(_fileName.c_str());
    //read
    ifs.read((char*)&info, sizeof(ServerInfo));
	//1.
    ofs << info._ip << info._port; //對(duì)象未重載<<
	//2.
    ifs >> info; //對(duì)象已重載>>
    cout << info << endl;
}

具體調(diào)用方式則是如下:

void TestCPP_Write_Bin() {
	ServerInfo info = { "192.168.1.1",80 };
	ConfigManage con("config.bin");
	con.WriteBin(info);
}
void TestCPP_Read_Bin() {
	ServerInfo info;
	ConfigManage con("config.bin");
	con.ReadBin(info);
}
void TestCPP_Write_Text() {
	ServerInfo info = { "192.168.1.1",80 };
	ConfigManage con("config.bin");
	con.WriteText(info);
}
void TestCPP_Read_Text() {
	ServerInfo info;
	ConfigManage con("config.bin");
	con.ReadText(info);
}

文件的輸入輸出流對(duì)象調(diào)用構(gòu)造函數(shù)時(shí)也可能會(huì)失敗,C++采取面向?qū)ο髵伄惓5男问健?/p>

2.3 C++ stringstream

在頭文件 下,有三個(gè)類(lèi):istringstream、ostringstream 和 stringstream,分別用來(lái)進(jìn)行字符串流的輸入、輸出和輸入輸出操作。

  • 字符串流ostringstream可以將一個(gè)其他類(lèi)型的數(shù)據(jù)轉(zhuǎn)化為字符串格式,該類(lèi)中的成員函數(shù)str可以返回轉(zhuǎn)出的字符串。
  • 字符串流istringstream可以將一個(gè)字符串格式轉(zhuǎn)化其他類(lèi)型的數(shù)據(jù),該類(lèi)中的成員函數(shù)str可以傳入需要轉(zhuǎn)化的字符串,或直接在構(gòu)造時(shí)傳入。
struct PersonInfo 
{
	string _name;
	int _age;
	friend ostream& operator<<(ostream& os, PersonInfo& info);
	friend istream& operator>>(istream& is, PersonInfo& info);
};
//序列化
PersonInfo info1 = { string("zhangsan"), 20 };
ostringstream oss;
//1.
oss << info1._name << " " << info1._age; //對(duì)象未重載<<
//2.
oss << info1;
string str = oss.str();
cout << str << endl;

//反序列化
PersonInfo info2;
istringstream iss(str);
iss.str(str);
//1.
iss >> info2._name >> info2._age; //對(duì)象未重載>>
//2.
iss >> info2;
cout << info2 << endl;

到此這篇關(guān)于C++IO流:fstream, stringstream總結(jié)的文章就介紹到這了,更多相關(guān)C++ fstream, stringstream內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析string 與char* char[]之間的轉(zhuǎn)換

    淺析string 與char* char[]之間的轉(zhuǎn)換

    與char*不同的是,string不一定以NULL('\0')結(jié)束。string長(zhǎng)度可以根據(jù)length()得到,string可以根據(jù)下標(biāo)訪問(wèn)。所以,不能將string直接賦值給char*
    2013-10-10
  • C++類(lèi)與對(duì)象深入之引用與內(nèi)聯(lián)函數(shù)與auto關(guān)鍵字及for循環(huán)詳解

    C++類(lèi)與對(duì)象深入之引用與內(nèi)聯(lián)函數(shù)與auto關(guān)鍵字及for循環(huán)詳解

    朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對(duì)一些C++的入門(mén)知識(shí)做了些總結(jié),整理出來(lái)一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們?cè)谠u(píng)論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步
    2022-06-06
  • C語(yǔ)言實(shí)現(xiàn)音樂(lè)播放器的示例代碼

    C語(yǔ)言實(shí)現(xiàn)音樂(lè)播放器的示例代碼

    這篇文章主要和大家分享了一個(gè)C語(yǔ)言的小DEMO,可以實(shí)現(xiàn)音樂(lè)播放器功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02
  • 提高C程序效率的10種有效方法

    提高C程序效率的10種有效方法

    本文向你介紹規(guī)范你的C代碼的10種方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • C語(yǔ)言中帶頭雙向循環(huán)鏈表基本操作的實(shí)現(xiàn)詳解

    C語(yǔ)言中帶頭雙向循環(huán)鏈表基本操作的實(shí)現(xiàn)詳解

    無(wú)頭單向非循環(huán)鏈表結(jié)構(gòu)簡(jiǎn)單,一般不會(huì)單獨(dú)用來(lái)存數(shù)據(jù)。而帶頭雙向循環(huán)鏈表的結(jié)構(gòu)較為復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。本文將介紹帶頭雙向循環(huán)鏈表的基本操作,需要的可以參考一下
    2022-11-11
  • C語(yǔ)言?const修飾普通變量和指針的操作代碼

    C語(yǔ)言?const修飾普通變量和指針的操作代碼

    這篇文章主要介紹了C語(yǔ)言const修飾普通變量和指針,用const修飾普通變量時(shí),是在語(yǔ)法層面限制了變量的修改,但是本質(zhì)上,變量還是變量,是一種不能被修改的變量,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 詳解C語(yǔ)言?xún)?nèi)核中的鏈表與結(jié)構(gòu)體

    詳解C語(yǔ)言?xún)?nèi)核中的鏈表與結(jié)構(gòu)體

    Windows內(nèi)核中是無(wú)法使用vector容器等數(shù)據(jù)結(jié)構(gòu)的,當(dāng)我們需要保存一個(gè)結(jié)構(gòu)體數(shù)組時(shí),就需要使用內(nèi)核中提供的專(zhuān)用鏈表結(jié)構(gòu)。本文分享了幾個(gè)內(nèi)核中使用鏈表存儲(chǔ)多個(gè)結(jié)構(gòu)體的通用案例,希望對(duì)你有所幫助
    2022-09-09
  • OpenCV圖像文件批量讀取編程實(shí)例

    OpenCV圖像文件批量讀取編程實(shí)例

    這篇文章主要為大家詳細(xì)介紹了OpenCV圖像文件批量讀取編程實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++深淺拷貝和寫(xiě)時(shí)拷貝圖文詳解

    C++深淺拷貝和寫(xiě)時(shí)拷貝圖文詳解

    這篇文章主要給大家介紹了關(guān)于C++深淺拷貝和寫(xiě)時(shí)拷貝的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • linux下c語(yǔ)言中隱藏進(jìn)程命令行參數(shù)(例如輸入密碼等高危操作)

    linux下c語(yǔ)言中隱藏進(jìn)程命令行參數(shù)(例如輸入密碼等高危操作)

    啟動(dòng)程序很多時(shí)候用命令行參數(shù)可以很方便,做到簡(jiǎn)化一些配置,但是輸入用戶(hù)名密碼等操作,如果通過(guò)進(jìn)程查看工具直接看到密碼就太不安全了,這里就為大家分享一下方法
    2021-01-01

最新評(píng)論