c++教學(xué)講解課件第11章_第1頁(yè)
c++教學(xué)講解課件第11章_第2頁(yè)
c++教學(xué)講解課件第11章_第3頁(yè)
c++教學(xué)講解課件第11章_第4頁(yè)
c++教學(xué)講解課件第11章_第5頁(yè)
已閱讀5頁(yè),還剩79頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第十一章流類庫(kù)與輸入/輸出清華大學(xué)鄭莉C++語(yǔ)言程序設(shè)計(jì)第十一章流類庫(kù)與輸入/輸出清華大學(xué)鄭莉C++語(yǔ)言程2本章主要內(nèi)容I/O流的概念輸出流輸入流輸入/輸出流2本章主要內(nèi)容I/O流的概念3I/O流的概念當(dāng)程序與外界環(huán)境進(jìn)行信息交換時(shí),存在著兩個(gè)對(duì)象,一個(gè)是程序中的對(duì)象,另一個(gè)是文件對(duì)象。流是一種抽象,它負(fù)責(zé)在數(shù)據(jù)的生產(chǎn)者和數(shù)據(jù)的消費(fèi)者之間建立聯(lián)系,并管理數(shù)據(jù)的流動(dòng)。程序建立一個(gè)流對(duì)象,并指定這個(gè)流對(duì)象與某個(gè)文件對(duì)象建立連接,程序操作流對(duì)象,流對(duì)象通過(guò)文件系統(tǒng)對(duì)所連接的文件對(duì)象產(chǎn)生作用。讀操作在流數(shù)據(jù)抽象中被稱為(從流中)提取,寫操作被稱為(向流中)插入。3I/O流的概念當(dāng)程序與外界環(huán)境進(jìn)行信息交換時(shí),存在著兩個(gè)對(duì)4輸出流最重要的三個(gè)輸出流是ostreamofstreamostringstream4輸出流最重要的三個(gè)輸出流是5輸出流對(duì)象預(yù)先定義的輸出流對(duì)象:cout標(biāo)準(zhǔn)輸出cerr標(biāo)準(zhǔn)錯(cuò)誤輸出,沒(méi)有緩沖,發(fā)送給它的內(nèi)容立即被輸出。clog類似于cerr,但是有緩沖,緩沖區(qū)滿時(shí)被輸出。輸出流5輸出流對(duì)象預(yù)先定義的輸出流對(duì)象:輸出流6輸出流對(duì)象ofstream類支持磁盤文件輸出如果在構(gòu)造函數(shù)中指定一個(gè)文件名,當(dāng)構(gòu)造這個(gè)文件時(shí)該文件是自動(dòng)打開(kāi)的ofstreammyFile("filename");可以在調(diào)用默認(rèn)構(gòu)造函數(shù)之后使用open成員函數(shù)打開(kāi)文件ofstreammyFile;//聲明一個(gè)靜態(tài)文件輸出流對(duì)象myFile.open("filename");

//打開(kāi)文件,使流對(duì)象與文件建立聯(lián)系在構(gòu)造對(duì)象或用open打開(kāi)文件時(shí)可以指定模式ofstreammyFile("filename",ios_base::out|ios_base::binary);輸出流6輸出流對(duì)象ofstream類支持磁盤文件輸出輸出流7插入運(yùn)算符(<<)插入(<<)運(yùn)算符是所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型預(yù)先設(shè)計(jì)的。用于傳送字節(jié)到一個(gè)輸出流對(duì)象。輸出流7插入運(yùn)算符(<<)插入(<<)運(yùn)算符是所有標(biāo)準(zhǔn)C++數(shù)據(jù)類8控制輸出格式控制輸出寬度為了調(diào)整輸出,可以通過(guò)在流中放入setw操縱符或調(diào)用width成員函數(shù)為每個(gè)項(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è)置對(duì)齊方式#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è)置對(duì)齊方式#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ù)把流與一個(gè)特定的磁盤文件關(guān)聯(lián)起來(lái)。需要指定打開(kāi)模式。put函數(shù)把一個(gè)字符寫到輸出流中。write函數(shù)把內(nèi)存中的一塊內(nèi)容寫到一個(gè)文件輸出流中seekp和tellp函數(shù)操作文件流的內(nèi)部指針close函數(shù)關(guān)閉與一個(gè)文件輸出流關(guān)聯(lián)的磁盤文件錯(cuò)誤處理函數(shù)在寫到一個(gè)流時(shí)進(jìn)行錯(cuò)誤處理輸出流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)造一個(gè)流,然后使用setmode成員函數(shù),在文件打開(kāi)后改變模式。使用ofstream構(gòu)造函數(shù)中的模式參量指定二進(jìn)制輸出模式輸出流17二進(jìn)制輸出文件以通常方式構(gòu)造一個(gè)流,然后使用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輸入流對(duì)象如果在構(gòu)造函數(shù)中指定一個(gè)文件名,在構(gòu)造該對(duì)象時(shí)該文件便自動(dòng)打開(kāi)。ifstreammyFile("filename");在調(diào)用默認(rèn)構(gòu)造函數(shù)之后使用open函數(shù)來(lái)打開(kāi)文件。ifstreammyFile;//建立一個(gè)文件流對(duì)象myFile.open("filename",);//打開(kāi)文件"filename”打開(kāi)文件時(shí)可以指定模式ifstreammyFile("filename",ios_base::in|ios_base::binary);輸入流21輸入流對(duì)象如果在構(gòu)造函數(shù)中指定一個(gè)文件名,在構(gòu)造該對(duì)象時(shí)22提取運(yùn)算符(>>)提取運(yùn)算符(>>)對(duì)于所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型都是預(yù)先設(shè)計(jì)好的。是從一個(gè)輸入流對(duì)象獲取字節(jié)最容易的方法。ios類中的很多操縱符都可以應(yīng)用于輸入流。但是只有少數(shù)幾個(gè)對(duì)輸入流對(duì)象具有實(shí)際影響,其中最重要的是進(jìn)制操縱符dec、oct和hex。輸入流22提取運(yùn)算符(>>)提取運(yùn)算符(>>)對(duì)于所有標(biāo)準(zhǔn)C++數(shù)23輸入流成員函數(shù)open函數(shù)把該流與一個(gè)特定磁盤文件相關(guān)聯(lián)。get函數(shù)的功能與提取運(yùn)算符(>>)很相像,主要的不同點(diǎn)是get函數(shù)在讀入數(shù)據(jù)時(shí)包括空白字符。(第6章介紹過(guò))getline的功能是從輸入流中讀取多個(gè)字符,并且允許指定輸入終止字符,讀取完成后,從讀取的內(nèi)容中刪除終止字符。(第6章介紹過(guò))read成員函數(shù)從一個(gè)文件讀字節(jié)到一個(gè)指定的內(nèi)存區(qū)域,由長(zhǎng)度參數(shù)確定要讀的字節(jié)數(shù)。

如果給出長(zhǎng)度參數(shù),當(dāng)遇到文件結(jié)束或者在文本模式文件中遇到文件結(jié)束標(biāo)記字符時(shí)結(jié)束讀取。輸入流23輸入流成員函數(shù)open函數(shù)把該流與一個(gè)特定磁盤文件相關(guān)聯(lián)24輸入流成員函數(shù)seekg函數(shù)用來(lái)設(shè)置文件輸入流中讀取數(shù)據(jù)位置的指針。tellg函數(shù)返回當(dāng)前文件讀指針的位置。close函數(shù)關(guān)閉與一個(gè)文件輸入流關(guān)聯(lián)的磁盤文件。輸入流24輸入流成員函數(shù)seekg函數(shù)用來(lái)設(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寬字符、寬字符串與寬流普通字符和字符串的缺陷一個(gè)漢字被拆成兩個(gè)字符例:strings=“這是一個(gè)中文字符串”;s.size():返回18s.substr(3,2):得到的結(jié)果是“且”s.find(“且”):返回331深度探索寬字符、寬字符串與寬流普通字符和字符串的缺陷31深度探索寬字符與寬字符串寬字符:wchar_t類型一般占2個(gè)字節(jié),可以直接存下一個(gè)漢字寬字符的文字以“L”開(kāi)頭,例:wchar_tc=L’人’;寬字符串:wstring類型與string同源typedefbasic_string<char>string;typedefbasic_string<wchar_t>wstring;例wstrings=L"這是一個(gè)中文字符串";s.size():返回932深度探索寬字符與寬字符串寬字符:wchar_t類型32深度探索寬流寬流:以寬字符為基本單位的流wistream、wifstream、wistringstream、wostream、wofstream、wostringstream、wios……wcin、wcout、wcerr、wclog寬字符和寬字符串需要通過(guò)寬流輸入輸出寬流與普通流一一對(duì)應(yīng),彼此同源typedefbasic_ifstream<char>ifstream;typedefbasic_ifstream<wchar_t>wifstream;33深度探索寬流寬流:以寬字符為基本單位的流33深度探索為寬文件流配置編碼方案文件以字節(jié)為單位,編碼方案決定了寬字符和字節(jié)的對(duì)應(yīng)關(guān)系例:L“ABCD”占4個(gè)字節(jié),L“甲乙丙丁”占8個(gè)字節(jié),這由編碼方案體現(xiàn)配置方法:用“代碼頁(yè)”編號(hào)構(gòu)造locale對(duì)象執(zhí)行流的imbue成員函數(shù)示例localeloc(".936");//創(chuàng)建本地化配置方案對(duì)象wcout.imbue(loc);//設(shè)置wcout對(duì)象的編碼方案wcout<<L"這是一個(gè)中文字符串"<<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)建文件寬輸入流,打開(kāi)文件 in.imbue(loc); //為in設(shè)置編碼方案

wstringline; //用來(lái)存儲(chǔ)一行內(nèi)容

unsignednumber=0; //記錄行號(hào)

while(getline(in,line)){ number++; //行號(hào)加1 if(line.find_first_of(L'人')!=wstring::npos)

wcout<<number<<L“:”<<line<<endl;

} return0;}深度探索例11-14寬流的應(yīng)用35#include<iostrea對(duì)象的串行化串行化:將對(duì)象寫入文件,使得在適當(dāng)?shù)臅r(shí)候?qū)ο竽軓奈募凶x出并恢復(fù)直接用write將對(duì)象內(nèi)容輸出、用read將對(duì)象恢復(fù)的問(wèn)題對(duì)象中存在指針時(shí),指針?biāo)笇?duì)象內(nèi)容不會(huì)被保存;對(duì)象的成員本身可能是存在指針的對(duì)象;對(duì)象不僅是數(shù)據(jù)的集合,還包括一系列行為,用read只能恢復(fù)數(shù)據(jù),不能觸發(fā)相應(yīng)行為36深度探索對(duì)象的串行化串行化:將對(duì)象寫入文件,使得在適當(dāng)?shù)臅r(shí)候?qū)ο竽軓拇谢幕痉椒ㄊ止ご谢幕痉椒ㄊ止ぞ帉憇ave和load函數(shù)按照相同的順序保存/恢復(fù)數(shù)據(jù)成員碰到指針時(shí),首先保存指針是否為空的標(biāo)志,如非空,將指針對(duì)象的內(nèi)容保存,load做相反操作完全手工編寫串行化函數(shù)的困境save和load對(duì)成員的操作順序完全相同,存在邏輯上的重復(fù)處理指針等操作過(guò)于繁瑣37深度探索串行化的基本方法手工串行化的基本方法37深度探索boost::serialization用Serialization庫(kù)將下列結(jié)構(gòu)體串行化:structSalaryInfo{ stringname; doublesalary; TaxInfo*tax;};只需增加一個(gè)成員函數(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ù)都通過(guò)這一段源代碼“&”被Serialization重載了,能夠處理各種基本數(shù)據(jù)類型、標(biāo)準(zhǔn)庫(kù)類型“&”碰到指針時(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深度探索文檔類的使用保存對(duì)象:用“<<”ofstreamofs("salary.txt",ios_base::out);text_oarchiveoa(ofs);oa<<s1;讀取對(duì)象:用“>>”ifstreamifs("salary.txt",ios_base::in);text_iarchiveia(ifs); SalaryInfos2;ia>>s2;41深度探索文檔類的使用保存對(duì)象:用“<<”41深度探索Serialization的其它功能Serialization的其它功能可以進(jìn)行版本控制全面支持對(duì)STL容器的串行化允許將serialize分開(kāi)定義為兩個(gè)不同的模板(save和load)進(jìn)行“對(duì)象追蹤”,如有兩個(gè)指針指向同一對(duì)象,它能保證這個(gè)對(duì)象只被串行化一次,而且恢復(fù)時(shí)也只生成一個(gè)對(duì)象42深度探索Serialization的其它功能Serializatio43小結(jié)與復(fù)習(xí)建議主要內(nèi)容I/O流的概念、輸出流、輸入流、輸入/輸出流。達(dá)到的目標(biāo)理解I/O流的概念,學(xué)會(huì)使用I/O流類庫(kù)實(shí)現(xiàn)文件輸入/輸出及格式控制。實(shí)驗(yàn)任務(wù)實(shí)驗(yàn)十一43小結(jié)與復(fù)習(xí)建議主要內(nèi)容第十一章流類庫(kù)與輸入/輸出清華大學(xué)鄭莉C++語(yǔ)言程序設(shè)計(jì)第十一章流類庫(kù)與輸入/輸出清華大學(xué)鄭莉C++語(yǔ)言程45本章主要內(nèi)容I/O流的概念輸出流輸入流輸入/輸出流2本章主要內(nèi)容I/O流的概念46I/O流的概念當(dāng)程序與外界環(huán)境進(jìn)行信息交換時(shí),存在著兩個(gè)對(duì)象,一個(gè)是程序中的對(duì)象,另一個(gè)是文件對(duì)象。流是一種抽象,它負(fù)責(zé)在數(shù)據(jù)的生產(chǎn)者和數(shù)據(jù)的消費(fèi)者之間建立聯(lián)系,并管理數(shù)據(jù)的流動(dòng)。程序建立一個(gè)流對(duì)象,并指定這個(gè)流對(duì)象與某個(gè)文件對(duì)象建立連接,程序操作流對(duì)象,流對(duì)象通過(guò)文件系統(tǒng)對(duì)所連接的文件對(duì)象產(chǎn)生作用。讀操作在流數(shù)據(jù)抽象中被稱為(從流中)提取,寫操作被稱為(向流中)插入。3I/O流的概念當(dāng)程序與外界環(huán)境進(jìn)行信息交換時(shí),存在著兩個(gè)對(duì)47輸出流最重要的三個(gè)輸出流是ostreamofstreamostringstream4輸出流最重要的三個(gè)輸出流是48輸出流對(duì)象預(yù)先定義的輸出流對(duì)象:cout標(biāo)準(zhǔn)輸出cerr標(biāo)準(zhǔn)錯(cuò)誤輸出,沒(méi)有緩沖,發(fā)送給它的內(nèi)容立即被輸出。clog類似于cerr,但是有緩沖,緩沖區(qū)滿時(shí)被輸出。輸出流5輸出流對(duì)象預(yù)先定義的輸出流對(duì)象:輸出流49輸出流對(duì)象ofstream類支持磁盤文件輸出如果在構(gòu)造函數(shù)中指定一個(gè)文件名,當(dāng)構(gòu)造這個(gè)文件時(shí)該文件是自動(dòng)打開(kāi)的ofstreammyFile("filename");可以在調(diào)用默認(rèn)構(gòu)造函數(shù)之后使用open成員函數(shù)打開(kāi)文件ofstreammyFile;//聲明一個(gè)靜態(tài)文件輸出流對(duì)象myFile.open("filename");

//打開(kāi)文件,使流對(duì)象與文件建立聯(lián)系在構(gòu)造對(duì)象或用open打開(kāi)文件時(shí)可以指定模式ofstreammyFile("filename",ios_base::out|ios_base::binary);輸出流6輸出流對(duì)象ofstream類支持磁盤文件輸出輸出流50插入運(yùn)算符(<<)插入(<<)運(yùn)算符是所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型預(yù)先設(shè)計(jì)的。用于傳送字節(jié)到一個(gè)輸出流對(duì)象。輸出流7插入運(yùn)算符(<<)插入(<<)運(yùn)算符是所有標(biāo)準(zhǔn)C++數(shù)據(jù)類51控制輸出格式控制輸出寬度為了調(diào)整輸出,可以通過(guò)在流中放入setw操縱符或調(diào)用width成員函數(shù)為每個(gè)項(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è)置對(duì)齊方式#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è)置對(duì)齊方式#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ù)把流與一個(gè)特定的磁盤文件關(guān)聯(lián)起來(lái)。需要指定打開(kāi)模式。put函數(shù)把一個(gè)字符寫到輸出流中。write函數(shù)把內(nèi)存中的一塊內(nèi)容寫到一個(gè)文件輸出流中seekp和tellp函數(shù)操作文件流的內(nèi)部指針close函數(shù)關(guān)閉與一個(gè)文件輸出流關(guān)聯(lián)的磁盤文件錯(cuò)誤處理函數(shù)在寫到一個(gè)流時(shí)進(jìn)行錯(cuò)誤處理輸出流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)造一個(gè)流,然后使用setmode成員函數(shù),在文件打開(kāi)后改變模式。使用ofstream構(gòu)造函數(shù)中的模式參量指定二進(jìn)制輸出模式輸出流17二進(jìn)制輸出文件以通常方式構(gòu)造一個(gè)流,然后使用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輸入流對(duì)象如果在構(gòu)造函數(shù)中指定一個(gè)文件名,在構(gòu)造該對(duì)象時(shí)該文件便自動(dòng)打開(kāi)。ifstreammyFile("filename");在調(diào)用默認(rèn)構(gòu)造函數(shù)之后使用open函數(shù)來(lái)打開(kāi)文件。ifstreammyFile;//建立一個(gè)文件流對(duì)象myFile.open("filename",);//打開(kāi)文件"filename”打開(kāi)文件時(shí)可以指定模式ifstreammyFile("filename",ios_base::in|ios_base::binary);輸入流21輸入流對(duì)象如果在構(gòu)造函數(shù)中指定一個(gè)文件名,在構(gòu)造該對(duì)象時(shí)65提取運(yùn)算符(>>)提取運(yùn)算符(>>)對(duì)于所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型都是預(yù)先設(shè)計(jì)好的。是從一個(gè)輸入流對(duì)象獲取字節(jié)最容易的方法。ios類中的很多操縱符都可以應(yīng)用于輸入流。但是只有少數(shù)幾個(gè)對(duì)輸入流對(duì)象具有實(shí)際影響,其中最重要的是進(jìn)制操縱符dec、oct和hex。輸入流22提取運(yùn)算符(>>)提取運(yùn)算符(>>)對(duì)于所有標(biāo)準(zhǔn)C++數(shù)66輸入流成員函數(shù)open函數(shù)把該流與一個(gè)特定磁盤文件相關(guān)聯(lián)。get函數(shù)的功能與提取運(yùn)算符(>>)很相像,主要的不同點(diǎn)是get函數(shù)在讀入數(shù)據(jù)時(shí)包括空白字符。(第6章介紹過(guò))getline的功能是從輸入流中讀取多個(gè)字符,并且允許指定輸入終止字符,讀取完成后,從讀取的內(nèi)容中刪除終止字符。(第6章介紹過(guò))read成員函數(shù)從一個(gè)文件讀字節(jié)到一個(gè)指定的內(nèi)存區(qū)域,由長(zhǎng)度參數(shù)確定要讀的字節(jié)數(shù)。

如果給出長(zhǎng)度參數(shù),當(dāng)遇到文件結(jié)束或者在文本模式文件中遇到文件結(jié)束標(biāo)記字符時(shí)結(jié)束讀取。輸入流23輸入流成員函數(shù)open函數(shù)把該流與一個(gè)特定磁盤文件相關(guān)聯(lián)67輸入流成員函數(shù)seekg函數(shù)用來(lái)設(shè)置文件輸入流中讀取數(shù)據(jù)位置的指針。tellg函數(shù)返回當(dāng)前文件讀指針的位置。close函數(shù)關(guān)閉與一個(gè)文件輸入流關(guān)聯(lián)的磁盤文件。輸入流24輸入流成員函數(shù)seekg函數(shù)用來(lái)設(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寬字符、寬字符串與寬流普通字符和字符串的缺陷一個(gè)漢字被拆成兩個(gè)字符例:strings=“這是一個(gè)中文字符串”;s.size():返回18s.substr(3,2):得到的結(jié)果是“且”s.find(“且”):返回374深度探索寬字符、寬字符串與寬流普通字符和字符串的缺陷31深度探索寬字符與寬字符串寬字符:wchar_t類型一般占2個(gè)字節(jié),可以直接存下一個(gè)漢字寬字符的文字以“L”開(kāi)頭,例:wchar_tc=L’人’;寬字符串:wstring類型與string同源typedefbasic_string<char>string;typedefbasic_string<wchar_t>wstring;例wstrings=L"這是一個(gè)中文字符串";s.size():返回975深度探索寬字符與寬字符串寬字符:wchar_t類型32深度探索寬流寬流:以寬字符為基本單位的流wistream、wifstream、wistringstream、wostream、wofstream、wostringstream、wios……wcin、wcout、wcerr、wclog寬字符和寬字符串需要通過(guò)寬流輸入輸出寬流與普通流一一對(duì)應(yīng),彼此同源typedefbasic_ifstream<char>ifstream;typedefbasic_ifstream<wchar_t>wifstream;76深度探索寬流寬流:以寬字符為基本單位的流33深度探索為寬文件流配置編碼方案文件以字節(jié)為單位,編碼方案決定了寬字符和字節(jié)的對(duì)應(yīng)關(guān)系例:L“ABCD”占4個(gè)字節(jié),L“甲乙丙丁”占8個(gè)字節(jié),這由編碼方案體現(xiàn)配置方法:用“代碼頁(yè)”編號(hào)構(gòu)造locale對(duì)象執(zhí)行流的imbue成員函數(shù)示例localeloc(".936");//創(chuàng)建本地化配置方案對(duì)象wcout.imbue(loc);//設(shè)置wcout對(duì)象的編碼方案wcout<<L"這是一個(gè)中文字符串"<<endl; //輸出字符串77深度探索為寬文件流配置編碼方案文件以字節(jié)為單位,編碼方案決定了寬字符例11-14寬流的應(yīng)用78#include

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論