版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第十一章流類庫與輸入/輸出清華大學(xué)鄭莉C++語言程序設(shè)計(jì)第十一章流類庫與輸入/輸出清華大學(xué)鄭莉C++語言程2本章主要內(nèi)容I/O流的概念輸出流輸入流輸入/輸出流2本章主要內(nèi)容I/O流的概念3I/O流的概念當(dāng)程序與外界環(huán)境進(jìn)行信息交換時(shí),存在著兩個對象,一個是程序中的對象,另一個是文件對象。流是一種抽象,它負(fù)責(zé)在數(shù)據(jù)的生產(chǎn)者和數(shù)據(jù)的消費(fèi)者之間建立聯(lián)系,并管理數(shù)據(jù)的流動。程序建立一個流對象,并指定這個流對象與某個文件對象建立連接,程序操作流對象,流對象通過文件系統(tǒng)對所連接的文件對象產(chǎn)生作用。讀操作在流數(shù)據(jù)抽象中被稱為(從流中)提取,寫操作被稱為(向流中)插入。3I/O流的概念當(dāng)程序與外界環(huán)境進(jìn)行信息交換時(shí),存在著兩個對4輸出流最重要的三個輸出流是ostreamofstreamostringstream4輸出流最重要的三個輸出流是5輸出流對象預(yù)先定義的輸出流對象:cout標(biāo)準(zhǔn)輸出cerr標(biāo)準(zhǔn)錯誤輸出,沒有緩沖,發(fā)送給它的內(nèi)容立即被輸出。clog類似于cerr,但是有緩沖,緩沖區(qū)滿時(shí)被輸出。輸出流5輸出流對象預(yù)先定義的輸出流對象:輸出流6輸出流對象ofstream類支持磁盤文件輸出如果在構(gòu)造函數(shù)中指定一個文件名,當(dāng)構(gòu)造這個文件時(shí)該文件是自動打開的ofstreammyFile("filename");可以在調(diào)用默認(rèn)構(gòu)造函數(shù)之后使用open成員函數(shù)打開文件ofstreammyFile;//聲明一個靜態(tài)文件輸出流對象myFile.open("filename");
//打開文件,使流對象與文件建立聯(lián)系在構(gòu)造對象或用open打開文件時(shí)可以指定模式ofstreammyFile("filename",ios_base::out|ios_base::binary);輸出流6輸出流對象ofstream類支持磁盤文件輸出輸出流7插入運(yùn)算符(<<)插入(<<)運(yùn)算符是所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型預(yù)先設(shè)計(jì)的。用于傳送字節(jié)到一個輸出流對象。輸出流7插入運(yùn)算符(<<)插入(<<)運(yùn)算符是所有標(biāo)準(zhǔn)C++數(shù)據(jù)類8控制輸出格式控制輸出寬度為了調(diào)整輸出,可以通過在流中放入setw操縱符或調(diào)用width成員函數(shù)為每個項(xiàng)指定輸出寬度。例11-1使用width控制輸出寬度#include<iostream>usingnamesoacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24}; for(inti=0;i<4;i++){ cout.width(10); cout<<values[i]<<endl; } return0;}輸出流輸出結(jié)果:1.2335.36653.74358.248控制輸出格式控制輸出寬度輸出流輸出結(jié)果:9例:使用*填充#include<iostream>usingnamespacestd;intmain(){doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i<4;i++){cout.width(10);
cout.fill('*');cout<<values[i]<<'\n';}return0;}輸出流輸出結(jié)果:******1.23*****35.36*****653.7***4358.249例:使用*填充#include<iostream>輸10例11-2使用setw指定寬度#include<iostream>#include<iomanip>#include<string>usingnamespacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24}; stringnames[]={"Zoot","Jimmy","Al","Stan"}; for(inti=0;i<4;i++) cout<<setw(6)<<names[i]
<<setw(10)<<values[i]<<endl; return0;}輸出流輸出結(jié)果:
Zoot1.23Jimmy35.36Al653.7Stan4358.2410例11-2使用setw指定寬度#include<ios11例11-3設(shè)置對齊方式#include<iostream>#include<iomanip>#include<string>usingnamespacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24}; stringnames[]={"Zoot","Jimmy","Al","Stan"}; for(inti=0;i<4;i++) cout<<setiosflags(ios_base::left) <<setw(6)<<names[i] <<resetiosflags(ios_base::left) <<setw(10)<<values[i]<<endl; return0;}輸出流輸出結(jié)果:Zoot1.23Jimmy35.36Al653.7Stan4358.2411例11-3設(shè)置對齊方式#include<iostrea12例11-4控制輸出精度#include<iostream>#include<iomanip>#include<string>usingnamespacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24}; stringnames[]={"Zoot","Jimmy","Al","Stan"}; for(inti=0;i<4;i++) cout<<setiosflags(ios_base::left) <<setw(6)<<names[i] <<resetiosflags(ios_base::left) <<setw(10)<<setprecision(1)<<values[i]
<<endl; return0;}輸出流輸出結(jié)果:Zoot1Jimmy4e+001Al7e+002Stan4e+00312例11-4控制輸出精度#include<iostrea13進(jìn)制dec、oct和hex操縱符設(shè)置輸入和輸出的默認(rèn)進(jìn)制。輸出流13進(jìn)制dec、oct和hex操縱符設(shè)置輸入和輸出的默認(rèn)進(jìn)制14文件輸出流成員函數(shù)輸出流成員函數(shù)有三種類型:與操縱符等價(jià)的成員函數(shù)。執(zhí)行非格式化寫操作的成員函數(shù)。其它修改流狀態(tài)且不同于操縱符或插入運(yùn)算符的成員函數(shù)。輸出流14文件輸出流成員函數(shù)輸出流成員函數(shù)有三種類型:輸出流15文件輸出流成員函數(shù)open函數(shù)把流與一個特定的磁盤文件關(guān)聯(lián)起來。需要指定打開模式。put函數(shù)把一個字符寫到輸出流中。write函數(shù)把內(nèi)存中的一塊內(nèi)容寫到一個文件輸出流中seekp和tellp函數(shù)操作文件流的內(nèi)部指針close函數(shù)關(guān)閉與一個文件輸出流關(guān)聯(lián)的磁盤文件錯誤處理函數(shù)在寫到一個流時(shí)進(jìn)行錯誤處理輸出流15文件輸出流成員函數(shù)open函數(shù)輸出流16例11-5向文件輸出#include<fstream>usingnamespacestd;structDate{ intmondy,day,year;};intmain(){ Datedt={6,10,92}; ofstreamfile("date.dat",ios_base::binary); file.write(reinterpret_cast<char*>(&dt),sizeof(dt)); file.close(); return0;}輸出流16例11-5向文件輸出#include<fstream>17二進(jìn)制輸出文件以通常方式構(gòu)造一個流,然后使用setmode成員函數(shù),在文件打開后改變模式。使用ofstream構(gòu)造函數(shù)中的模式參量指定二進(jìn)制輸出模式輸出流17二進(jìn)制輸出文件以通常方式構(gòu)造一個流,然后使用setmod字符串輸出流ostringstream用于構(gòu)造字符串功能支持ofstream類的除open、close外的所有操作str函數(shù)可以返回當(dāng)前已構(gòu)造的字符串典型應(yīng)用將數(shù)值轉(zhuǎn)換為字符串18輸出流字符串輸出流ostringstream用于構(gòu)造字符串18輸出19例11-6字符串輸出流應(yīng)用#include<iostream>#include<sstream>#include<string>usingnamespacestd;template<classT>inlinestringtoString(constT&v){ ostringstreamos; //創(chuàng)建字符串輸出流
os<<v; //將變量v的值寫入字符串流
returnos.str(); //返回輸出流生成的字符串}intmain(){ stringstr1=toString(5); cout<<str1<<endl; stringstr2=toString(1.2); cout<<str2<<endl; return0;}輸出流輸出結(jié)果:51.219例11-6字符串輸出流應(yīng)用#include<iost20輸入流重要的輸入流類:istream類最適合用于順序文本模式輸入。
cin是其實(shí)例。ifstream類支持磁盤文件輸入。istringstream輸入流20輸入流重要的輸入流類:輸入流21輸入流對象如果在構(gòu)造函數(shù)中指定一個文件名,在構(gòu)造該對象時(shí)該文件便自動打開。ifstreammyFile("filename");在調(diào)用默認(rèn)構(gòu)造函數(shù)之后使用open函數(shù)來打開文件。ifstreammyFile;//建立一個文件流對象myFile.open("filename",);//打開文件"filename”打開文件時(shí)可以指定模式ifstreammyFile("filename",ios_base::in|ios_base::binary);輸入流21輸入流對象如果在構(gòu)造函數(shù)中指定一個文件名,在構(gòu)造該對象時(shí)22提取運(yùn)算符(>>)提取運(yùn)算符(>>)對于所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型都是預(yù)先設(shè)計(jì)好的。是從一個輸入流對象獲取字節(jié)最容易的方法。ios類中的很多操縱符都可以應(yīng)用于輸入流。但是只有少數(shù)幾個對輸入流對象具有實(shí)際影響,其中最重要的是進(jìn)制操縱符dec、oct和hex。輸入流22提取運(yùn)算符(>>)提取運(yùn)算符(>>)對于所有標(biāo)準(zhǔn)C++數(shù)23輸入流成員函數(shù)open函數(shù)把該流與一個特定磁盤文件相關(guān)聯(lián)。get函數(shù)的功能與提取運(yùn)算符(>>)很相像,主要的不同點(diǎn)是get函數(shù)在讀入數(shù)據(jù)時(shí)包括空白字符。(第6章介紹過)getline的功能是從輸入流中讀取多個字符,并且允許指定輸入終止字符,讀取完成后,從讀取的內(nèi)容中刪除終止字符。(第6章介紹過)read成員函數(shù)從一個文件讀字節(jié)到一個指定的內(nèi)存區(qū)域,由長度參數(shù)確定要讀的字節(jié)數(shù)。
如果給出長度參數(shù),當(dāng)遇到文件結(jié)束或者在文本模式文件中遇到文件結(jié)束標(biāo)記字符時(shí)結(jié)束讀取。輸入流23輸入流成員函數(shù)open函數(shù)把該流與一個特定磁盤文件相關(guān)聯(lián)24輸入流成員函數(shù)seekg函數(shù)用來設(shè)置文件輸入流中讀取數(shù)據(jù)位置的指針。tellg函數(shù)返回當(dāng)前文件讀指針的位置。close函數(shù)關(guān)閉與一個文件輸入流關(guān)聯(lián)的磁盤文件。輸入流24輸入流成員函數(shù)seekg函數(shù)用來設(shè)置文件輸入流中讀取數(shù)據(jù)25例11-9從文件讀二進(jìn)制記錄#include<iostream>#include<fstream>#include<cstring>usingnamespacestd;structSalaryInfo{ unsignedid; doublesalary;};intmain(){ SalaryInfoemployee1={600001,8000}; ofstreamos("payroll",ios_base::out|ios_base::binary); os.write(reinterpret_cast<char*>(&employee1),sizeof(employee1)); os.close();輸入流25例11-9從文件讀二進(jìn)制記錄#include<ios26 ifstreamis("payroll",ios_base::in|ios_base::binary); if(is){ SalaryInfoemployee2; is.read(reinterpret_cast<char*>(&employee2),
sizeof(employee2)); cout<<employee2.id<<""<<employee2.salary<<endl; }else{ cout<<"ERROR:Cannotopenfile'payroll'."<<endl; } is.close(); return0;}輸入流26輸入流27例11-10設(shè)置位置指針#include<iostream>#include<fstream>usingnamespacestd;intmain(){ intvalues[]={3,7,0,5,4}; ofstreamos("integers",ios_base::out|ios_base::binary); os.write(reinterpret_cast<char*>(values),sizeof(values)); os.close(); ifstreamis("integers",ios_base::in|ios_base::binary); if(is){ is.seekg(3*sizeof(int)); intv; is.read(reinterpret_cast<char*>(&v),sizeof(int)); cout<<"The4thintegerinthefile'integers'is"
<<v<<endl; }else cout<<"ERROR:Cannotopenfile'integers'."<<endl; return0;}輸入流27例11-10設(shè)置位置指針#include<iostr28例11-11讀文件并顯示其中空格的位置#include<iostream>#include<fstream>usingnamespacestd;intmain(){ ifstreamfile("integers",ios_base::in|ios_base::binary); if(file){ while(file){ streamposhere=file.tellg(); intv; file.read(reinterpret_cast<char*>(&v),sizeof(int)); if(file&&v==0) cout<<"Position"<<here<<"is0"<<endl; } }else{ cout<<"ERROR:Cannotopenfile'integers'."<<endl; } file.close(); return0;}輸入流28例11-11讀文件并顯示其中空格的位置#include字符串輸入流istringstream用于從字符串讀取數(shù)據(jù)在構(gòu)造函數(shù)中設(shè)置要讀取的字符串功能支持ifstream類的除open、close外的所有操作典型應(yīng)用將字符串轉(zhuǎn)換為數(shù)值29輸入流字符串輸入流istringstream用于從字符串讀取數(shù)據(jù)2例11-12字符串輸入流應(yīng)用30#include<iostream>#include<sstream>#include<string>usingnamespacestd;template<classT>inlineTfromString(conststring&str){ istringstreamis(str); //創(chuàng)建字符串輸入流
Tv; is>>v; //從字符串輸入流中讀取變量v returnv; //返回變量v}intmain(){ intv1=fromString<int>("5"); cout<<v1<<endl; doublev2=fromString<double>("1.2"); cout<<v2<<endl; return0;}輸出結(jié)果:51.2輸入流例11-12字符串輸入流應(yīng)用30#include<ios寬字符、寬字符串與寬流普通字符和字符串的缺陷一個漢字被拆成兩個字符例:strings=“這是一個中文字符串”;s.size():返回18s.substr(3,2):得到的結(jié)果是“且”s.find(“且”):返回331深度探索寬字符、寬字符串與寬流普通字符和字符串的缺陷31深度探索寬字符與寬字符串寬字符:wchar_t類型一般占2個字節(jié),可以直接存下一個漢字寬字符的文字以“L”開頭,例:wchar_tc=L’人’;寬字符串:wstring類型與string同源typedefbasic_string<char>string;typedefbasic_string<wchar_t>wstring;例wstrings=L"這是一個中文字符串";s.size():返回932深度探索寬字符與寬字符串寬字符:wchar_t類型32深度探索寬流寬流:以寬字符為基本單位的流wistream、wifstream、wistringstream、wostream、wofstream、wostringstream、wios……wcin、wcout、wcerr、wclog寬字符和寬字符串需要通過寬流輸入輸出寬流與普通流一一對應(yīng),彼此同源typedefbasic_ifstream<char>ifstream;typedefbasic_ifstream<wchar_t>wifstream;33深度探索寬流寬流:以寬字符為基本單位的流33深度探索為寬文件流配置編碼方案文件以字節(jié)為單位,編碼方案決定了寬字符和字節(jié)的對應(yīng)關(guān)系例:L“ABCD”占4個字節(jié),L“甲乙丙丁”占8個字節(jié),這由編碼方案體現(xiàn)配置方法:用“代碼頁”編號構(gòu)造locale對象執(zhí)行流的imbue成員函數(shù)示例localeloc(".936");//創(chuàng)建本地化配置方案對象wcout.imbue(loc);//設(shè)置wcout對象的編碼方案wcout<<L"這是一個中文字符串"<<endl; //輸出字符串34深度探索為寬文件流配置編碼方案文件以字節(jié)為單位,編碼方案決定了寬字符例11-14寬流的應(yīng)用35#include<iostream>#include<string>#include<fstream>#include<locale>usingnamespacestd;intmain(){ localeloc(".936"); //創(chuàng)建本地化配置方案
wcout.imbue(loc); //為wcout設(shè)置編碼方案
wifstreamin(“article.txt”);//創(chuàng)建文件寬輸入流,打開文件 in.imbue(loc); //為in設(shè)置編碼方案
wstringline; //用來存儲一行內(nèi)容
unsignednumber=0; //記錄行號
while(getline(in,line)){ number++; //行號加1 if(line.find_first_of(L'人')!=wstring::npos)
wcout<<number<<L“:”<<line<<endl;
} return0;}深度探索例11-14寬流的應(yīng)用35#include<iostrea對象的串行化串行化:將對象寫入文件,使得在適當(dāng)?shù)臅r(shí)候?qū)ο竽軓奈募凶x出并恢復(fù)直接用write將對象內(nèi)容輸出、用read將對象恢復(fù)的問題對象中存在指針時(shí),指針?biāo)笇ο髢?nèi)容不會被保存;對象的成員本身可能是存在指針的對象;對象不僅是數(shù)據(jù)的集合,還包括一系列行為,用read只能恢復(fù)數(shù)據(jù),不能觸發(fā)相應(yīng)行為36深度探索對象的串行化串行化:將對象寫入文件,使得在適當(dāng)?shù)臅r(shí)候?qū)ο竽軓拇谢幕痉椒ㄊ止ご谢幕痉椒ㄊ止ぞ帉憇ave和load函數(shù)按照相同的順序保存/恢復(fù)數(shù)據(jù)成員碰到指針時(shí),首先保存指針是否為空的標(biāo)志,如非空,將指針對象的內(nèi)容保存,load做相反操作完全手工編寫串行化函數(shù)的困境save和load對成員的操作順序完全相同,存在邏輯上的重復(fù)處理指針等操作過于繁瑣37深度探索串行化的基本方法手工串行化的基本方法37深度探索boost::serialization用Serialization庫將下列結(jié)構(gòu)體串行化:structSalaryInfo{ stringname; doublesalary; TaxInfo*tax;};只需增加一個成員函數(shù)模板(需要TaxInfo也實(shí)現(xiàn)了同樣的成員函數(shù)模板):template<classArchive>voidSalaryInfo::serialize(Archive&ar,unsignedintversion){ ar&name&salary&tax;}38深度探索boost::serialization用Serializa理解Serializationserialize函數(shù)serialize是模板,串行化和恢復(fù)都通過這一段源代碼“&”被Serialization重載了,能夠處理各種基本數(shù)據(jù)類型、標(biāo)準(zhǔn)庫類型“&”碰到指針時(shí),如果指針的目的類型也有serialize成員函數(shù),則用該函數(shù)將指針內(nèi)容串行化/恢復(fù)39深度探索理解Serializationserialize函數(shù)39深度Serialization的文檔類文檔類用于實(shí)際執(zhí)行串行化操作支持5種串行化格式普通文本:text_oachive/text_iachive寬文本:text_woachive/text_wiachive普通字符XML:xml_oachive/xml_iachive寬字符XML:xml_woachive/xml_wiachive二進(jìn)制:binary_oachive/binary_iachive40深度探索Serialization的文檔類文檔類40深度探索文檔類的使用保存對象:用“<<”ofstreamofs("salary.txt",ios_base::out);text_oarchiveoa(ofs);oa<<s1;讀取對象:用“>>”ifstreamifs("salary.txt",ios_base::in);text_iarchiveia(ifs); SalaryInfos2;ia>>s2;41深度探索文檔類的使用保存對象:用“<<”41深度探索Serialization的其它功能Serialization的其它功能可以進(jìn)行版本控制全面支持對STL容器的串行化允許將serialize分開定義為兩個不同的模板(save和load)進(jìn)行“對象追蹤”,如有兩個指針指向同一對象,它能保證這個對象只被串行化一次,而且恢復(fù)時(shí)也只生成一個對象42深度探索Serialization的其它功能Serializatio43小結(jié)與復(fù)習(xí)建議主要內(nèi)容I/O流的概念、輸出流、輸入流、輸入/輸出流。達(dá)到的目標(biāo)理解I/O流的概念,學(xué)會使用I/O流類庫實(shí)現(xiàn)文件輸入/輸出及格式控制。實(shí)驗(yàn)任務(wù)實(shí)驗(yàn)十一43小結(jié)與復(fù)習(xí)建議主要內(nèi)容第十一章流類庫與輸入/輸出清華大學(xué)鄭莉C++語言程序設(shè)計(jì)第十一章流類庫與輸入/輸出清華大學(xué)鄭莉C++語言程45本章主要內(nèi)容I/O流的概念輸出流輸入流輸入/輸出流2本章主要內(nèi)容I/O流的概念46I/O流的概念當(dāng)程序與外界環(huán)境進(jìn)行信息交換時(shí),存在著兩個對象,一個是程序中的對象,另一個是文件對象。流是一種抽象,它負(fù)責(zé)在數(shù)據(jù)的生產(chǎn)者和數(shù)據(jù)的消費(fèi)者之間建立聯(lián)系,并管理數(shù)據(jù)的流動。程序建立一個流對象,并指定這個流對象與某個文件對象建立連接,程序操作流對象,流對象通過文件系統(tǒng)對所連接的文件對象產(chǎn)生作用。讀操作在流數(shù)據(jù)抽象中被稱為(從流中)提取,寫操作被稱為(向流中)插入。3I/O流的概念當(dāng)程序與外界環(huán)境進(jìn)行信息交換時(shí),存在著兩個對47輸出流最重要的三個輸出流是ostreamofstreamostringstream4輸出流最重要的三個輸出流是48輸出流對象預(yù)先定義的輸出流對象:cout標(biāo)準(zhǔn)輸出cerr標(biāo)準(zhǔn)錯誤輸出,沒有緩沖,發(fā)送給它的內(nèi)容立即被輸出。clog類似于cerr,但是有緩沖,緩沖區(qū)滿時(shí)被輸出。輸出流5輸出流對象預(yù)先定義的輸出流對象:輸出流49輸出流對象ofstream類支持磁盤文件輸出如果在構(gòu)造函數(shù)中指定一個文件名,當(dāng)構(gòu)造這個文件時(shí)該文件是自動打開的ofstreammyFile("filename");可以在調(diào)用默認(rèn)構(gòu)造函數(shù)之后使用open成員函數(shù)打開文件ofstreammyFile;//聲明一個靜態(tài)文件輸出流對象myFile.open("filename");
//打開文件,使流對象與文件建立聯(lián)系在構(gòu)造對象或用open打開文件時(shí)可以指定模式ofstreammyFile("filename",ios_base::out|ios_base::binary);輸出流6輸出流對象ofstream類支持磁盤文件輸出輸出流50插入運(yùn)算符(<<)插入(<<)運(yùn)算符是所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型預(yù)先設(shè)計(jì)的。用于傳送字節(jié)到一個輸出流對象。輸出流7插入運(yùn)算符(<<)插入(<<)運(yùn)算符是所有標(biāo)準(zhǔn)C++數(shù)據(jù)類51控制輸出格式控制輸出寬度為了調(diào)整輸出,可以通過在流中放入setw操縱符或調(diào)用width成員函數(shù)為每個項(xiàng)指定輸出寬度。例11-1使用width控制輸出寬度#include<iostream>usingnamesoacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24}; for(inti=0;i<4;i++){ cout.width(10); cout<<values[i]<<endl; } return0;}輸出流輸出結(jié)果:1.2335.36653.74358.248控制輸出格式控制輸出寬度輸出流輸出結(jié)果:52例:使用*填充#include<iostream>usingnamespacestd;intmain(){doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i<4;i++){cout.width(10);
cout.fill('*');cout<<values[i]<<'\n';}return0;}輸出流輸出結(jié)果:******1.23*****35.36*****653.7***4358.249例:使用*填充#include<iostream>輸53例11-2使用setw指定寬度#include<iostream>#include<iomanip>#include<string>usingnamespacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24}; stringnames[]={"Zoot","Jimmy","Al","Stan"}; for(inti=0;i<4;i++) cout<<setw(6)<<names[i]
<<setw(10)<<values[i]<<endl; return0;}輸出流輸出結(jié)果:
Zoot1.23Jimmy35.36Al653.7Stan4358.2410例11-2使用setw指定寬度#include<ios54例11-3設(shè)置對齊方式#include<iostream>#include<iomanip>#include<string>usingnamespacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24}; stringnames[]={"Zoot","Jimmy","Al","Stan"}; for(inti=0;i<4;i++) cout<<setiosflags(ios_base::left) <<setw(6)<<names[i] <<resetiosflags(ios_base::left) <<setw(10)<<values[i]<<endl; return0;}輸出流輸出結(jié)果:Zoot1.23Jimmy35.36Al653.7Stan4358.2411例11-3設(shè)置對齊方式#include<iostrea55例11-4控制輸出精度#include<iostream>#include<iomanip>#include<string>usingnamespacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24}; stringnames[]={"Zoot","Jimmy","Al","Stan"}; for(inti=0;i<4;i++) cout<<setiosflags(ios_base::left) <<setw(6)<<names[i] <<resetiosflags(ios_base::left) <<setw(10)<<setprecision(1)<<values[i]
<<endl; return0;}輸出流輸出結(jié)果:Zoot1Jimmy4e+001Al7e+002Stan4e+00312例11-4控制輸出精度#include<iostrea56進(jìn)制dec、oct和hex操縱符設(shè)置輸入和輸出的默認(rèn)進(jìn)制。輸出流13進(jìn)制dec、oct和hex操縱符設(shè)置輸入和輸出的默認(rèn)進(jìn)制57文件輸出流成員函數(shù)輸出流成員函數(shù)有三種類型:與操縱符等價(jià)的成員函數(shù)。執(zhí)行非格式化寫操作的成員函數(shù)。其它修改流狀態(tài)且不同于操縱符或插入運(yùn)算符的成員函數(shù)。輸出流14文件輸出流成員函數(shù)輸出流成員函數(shù)有三種類型:輸出流58文件輸出流成員函數(shù)open函數(shù)把流與一個特定的磁盤文件關(guān)聯(lián)起來。需要指定打開模式。put函數(shù)把一個字符寫到輸出流中。write函數(shù)把內(nèi)存中的一塊內(nèi)容寫到一個文件輸出流中seekp和tellp函數(shù)操作文件流的內(nèi)部指針close函數(shù)關(guān)閉與一個文件輸出流關(guān)聯(lián)的磁盤文件錯誤處理函數(shù)在寫到一個流時(shí)進(jìn)行錯誤處理輸出流15文件輸出流成員函數(shù)open函數(shù)輸出流59例11-5向文件輸出#include<fstream>usingnamespacestd;structDate{ intmondy,day,year;};intmain(){ Datedt={6,10,92}; ofstreamfile("date.dat",ios_base::binary); file.write(reinterpret_cast<char*>(&dt),sizeof(dt)); file.close(); return0;}輸出流16例11-5向文件輸出#include<fstream>60二進(jìn)制輸出文件以通常方式構(gòu)造一個流,然后使用setmode成員函數(shù),在文件打開后改變模式。使用ofstream構(gòu)造函數(shù)中的模式參量指定二進(jìn)制輸出模式輸出流17二進(jìn)制輸出文件以通常方式構(gòu)造一個流,然后使用setmod字符串輸出流ostringstream用于構(gòu)造字符串功能支持ofstream類的除open、close外的所有操作str函數(shù)可以返回當(dāng)前已構(gòu)造的字符串典型應(yīng)用將數(shù)值轉(zhuǎn)換為字符串61輸出流字符串輸出流ostringstream用于構(gòu)造字符串18輸出62例11-6字符串輸出流應(yīng)用#include<iostream>#include<sstream>#include<string>usingnamespacestd;template<classT>inlinestringtoString(constT&v){ ostringstreamos; //創(chuàng)建字符串輸出流
os<<v; //將變量v的值寫入字符串流
returnos.str(); //返回輸出流生成的字符串}intmain(){ stringstr1=toString(5); cout<<str1<<endl; stringstr2=toString(1.2); cout<<str2<<endl; return0;}輸出流輸出結(jié)果:51.219例11-6字符串輸出流應(yīng)用#include<iost63輸入流重要的輸入流類:istream類最適合用于順序文本模式輸入。
cin是其實(shí)例。ifstream類支持磁盤文件輸入。istringstream輸入流20輸入流重要的輸入流類:輸入流64輸入流對象如果在構(gòu)造函數(shù)中指定一個文件名,在構(gòu)造該對象時(shí)該文件便自動打開。ifstreammyFile("filename");在調(diào)用默認(rèn)構(gòu)造函數(shù)之后使用open函數(shù)來打開文件。ifstreammyFile;//建立一個文件流對象myFile.open("filename",);//打開文件"filename”打開文件時(shí)可以指定模式ifstreammyFile("filename",ios_base::in|ios_base::binary);輸入流21輸入流對象如果在構(gòu)造函數(shù)中指定一個文件名,在構(gòu)造該對象時(shí)65提取運(yùn)算符(>>)提取運(yùn)算符(>>)對于所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型都是預(yù)先設(shè)計(jì)好的。是從一個輸入流對象獲取字節(jié)最容易的方法。ios類中的很多操縱符都可以應(yīng)用于輸入流。但是只有少數(shù)幾個對輸入流對象具有實(shí)際影響,其中最重要的是進(jìn)制操縱符dec、oct和hex。輸入流22提取運(yùn)算符(>>)提取運(yùn)算符(>>)對于所有標(biāo)準(zhǔn)C++數(shù)66輸入流成員函數(shù)open函數(shù)把該流與一個特定磁盤文件相關(guān)聯(lián)。get函數(shù)的功能與提取運(yùn)算符(>>)很相像,主要的不同點(diǎn)是get函數(shù)在讀入數(shù)據(jù)時(shí)包括空白字符。(第6章介紹過)getline的功能是從輸入流中讀取多個字符,并且允許指定輸入終止字符,讀取完成后,從讀取的內(nèi)容中刪除終止字符。(第6章介紹過)read成員函數(shù)從一個文件讀字節(jié)到一個指定的內(nèi)存區(qū)域,由長度參數(shù)確定要讀的字節(jié)數(shù)。
如果給出長度參數(shù),當(dāng)遇到文件結(jié)束或者在文本模式文件中遇到文件結(jié)束標(biāo)記字符時(shí)結(jié)束讀取。輸入流23輸入流成員函數(shù)open函數(shù)把該流與一個特定磁盤文件相關(guān)聯(lián)67輸入流成員函數(shù)seekg函數(shù)用來設(shè)置文件輸入流中讀取數(shù)據(jù)位置的指針。tellg函數(shù)返回當(dāng)前文件讀指針的位置。close函數(shù)關(guān)閉與一個文件輸入流關(guān)聯(lián)的磁盤文件。輸入流24輸入流成員函數(shù)seekg函數(shù)用來設(shè)置文件輸入流中讀取數(shù)據(jù)68例11-9從文件讀二進(jìn)制記錄#include<iostream>#include<fstream>#include<cstring>usingnamespacestd;structSalaryInfo{ unsignedid; doublesalary;};intmain(){ SalaryInfoemployee1={600001,8000}; ofstreamos("payroll",ios_base::out|ios_base::binary); os.write(reinterpret_cast<char*>(&employee1),sizeof(employee1)); os.close();輸入流25例11-9從文件讀二進(jìn)制記錄#include<ios69 ifstreamis("payroll",ios_base::in|ios_base::binary); if(is){ SalaryInfoemployee2; is.read(reinterpret_cast<char*>(&employee2),
sizeof(employee2)); cout<<employee2.id<<""<<employee2.salary<<endl; }else{ cout<<"ERROR:Cannotopenfile'payroll'."<<endl; } is.close(); return0;}輸入流26輸入流70例11-10設(shè)置位置指針#include<iostream>#include<fstream>usingnamespacestd;intmain(){ intvalues[]={3,7,0,5,4}; ofstreamos("integers",ios_base::out|ios_base::binary); os.write(reinterpret_cast<char*>(values),sizeof(values)); os.close(); ifstreamis("integers",ios_base::in|ios_base::binary); if(is){ is.seekg(3*sizeof(int)); intv; is.read(reinterpret_cast<char*>(&v),sizeof(int)); cout<<"The4thintegerinthefile'integers'is"
<<v<<endl; }else cout<<"ERROR:Cannotopenfile'integers'."<<endl; return0;}輸入流27例11-10設(shè)置位置指針#include<iostr71例11-11讀文件并顯示其中空格的位置#include<iostream>#include<fstream>usingnamespacestd;intmain(){ ifstreamfile("integers",ios_base::in|ios_base::binary); if(file){ while(file){ streamposhere=file.tellg(); intv; file.read(reinterpret_cast<char*>(&v),sizeof(int)); if(file&&v==0) cout<<"Position"<<here<<"is0"<<endl; } }else{ cout<<"ERROR:Cannotopenfile'integers'."<<endl; } file.close(); return0;}輸入流28例11-11讀文件并顯示其中空格的位置#include字符串輸入流istringstream用于從字符串讀取數(shù)據(jù)在構(gòu)造函數(shù)中設(shè)置要讀取的字符串功能支持ifstream類的除open、close外的所有操作典型應(yīng)用將字符串轉(zhuǎn)換為數(shù)值72輸入流字符串輸入流istringstream用于從字符串讀取數(shù)據(jù)2例11-12字符串輸入流應(yīng)用73#include<iostream>#include<sstream>#include<string>usingnamespacestd;template<classT>inlineTfromString(conststring&str){ istringstreamis(str); //創(chuàng)建字符串輸入流
Tv; is>>v; //從字符串輸入流中讀取變量v returnv; //返回變量v}intmain(){ intv1=fromString<int>("5"); cout<<v1<<endl; doublev2=fromString<double>("1.2"); cout<<v2<<endl; return0;}輸出結(jié)果:51.2輸入流例11-12字符串輸入流應(yīng)用30#include<ios寬字符、寬字符串與寬流普通字符和字符串的缺陷一個漢字被拆成兩個字符例:strings=“這是一個中文字符串”;s.size():返回18s.substr(3,2):得到的結(jié)果是“且”s.find(“且”):返回374深度探索寬字符、寬字符串與寬流普通字符和字符串的缺陷31深度探索寬字符與寬字符串寬字符:wchar_t類型一般占2個字節(jié),可以直接存下一個漢字寬字符的文字以“L”開頭,例:wchar_tc=L’人’;寬字符串:wstring類型與string同源typedefbasic_string<char>string;typedefbasic_string<wchar_t>wstring;例wstrings=L"這是一個中文字符串";s.size():返回975深度探索寬字符與寬字符串寬字符:wchar_t類型32深度探索寬流寬流:以寬字符為基本單位的流wistream、wifstream、wistringstream、wostream、wofstream、wostringstream、wios……wcin、wcout、wcerr、wclog寬字符和寬字符串需要通過寬流輸入輸出寬流與普通流一一對應(yīng),彼此同源typedefbasic_ifstream<char>ifstream;typedefbasic_ifstream<wchar_t>wifstream;76深度探索寬流寬流:以寬字符為基本單位的流33深度探索為寬文件流配置編碼方案文件以字節(jié)為單位,編碼方案決定了寬字符和字節(jié)的對應(yīng)關(guān)系例:L“ABCD”占4個字節(jié),L“甲乙丙丁”占8個字節(jié),這由編碼方案體現(xiàn)配置方法:用“代碼頁”編號構(gòu)造locale對象執(zhí)行流的imbue成員函數(shù)示例localeloc(".936");//創(chuàng)建本地化配置方案對象wcout.imbue(loc);//設(shè)置wcout對象的編碼方案wcout<<L"這是一個中文字符串"<<endl; //輸出字符串77深度探索為寬文件流配置編碼方案文件以字節(jié)為單位,編碼方案決定了寬字符例11-14寬流的應(yīng)用78#include
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第2單元 社會主義制度的建立與社會主義建設(shè)的探索 測試卷-2021-2022學(xué)年部編版八年級歷史下冊
- 八年級下冊期末考試模擬卷03(答案及解析)
- 《客戶經(jīng)理分享》課件
- 婚慶行業(yè)前臺服務(wù)工作總結(jié)
- 七年級下《鶴群》語文版-課件
- 2024員工三級安全培訓(xùn)考試題及答案考試直接用
- 小學(xué)生演講稿(15篇)
- 《社會工作概論概述》課件
- 季度成績梳理
- 皮膚護(hù)理QC課題
- 2024午托承包合同-校園內(nèi)學(xué)生午休服務(wù)協(xié)議3篇
- 馬克思主義基本原理+2024秋+試題 答案 國開
- 蘇州大學(xué)《線性代數(shù)與解析幾何》2023-2024學(xué)年第一學(xué)期期末試卷
- 《地震災(zāi)害及其防治》課件
- 2024年版電商平臺入駐商家服務(wù)與銷售分成合同
- 蜜雪冰城合同范例
- 小紅書種草營銷師(初級)認(rèn)證考試真題試題庫(含答案)
- LPG液化氣充裝站介質(zhì)分析操作規(guī)程 202412
- 養(yǎng)老院環(huán)境衛(wèi)生保潔方案
- 2024年WPS計(jì)算機(jī)二級考試題庫350題(含答案)
- 2024年5G網(wǎng)絡(luò)覆蓋工程分包合同
評論
0/150
提交評論