版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第9章C++語言的I/O流庫王雪晶9.1屏幕輸出9.2鍵盤輸入9.3格式化輸入和輸出9.4磁盤文件的輸入和輸出內(nèi)容數(shù)據(jù)的傳送被看成像流水一樣,從一處流向另一處,數(shù)據(jù)的傳遞被稱為數(shù)據(jù)流。數(shù)據(jù)流中流動的字節(jié)序列。數(shù)據(jù)流按其流向可分為:輸入流指的是字節(jié)流從輸入設(shè)備流向內(nèi)存。輸出流指的是字節(jié)流從內(nèi)存流向輸出設(shè)備。輸入流和輸出流都是帶有內(nèi)存緩沖區(qū)的,用來存放流中的數(shù)據(jù)。流是與內(nèi)存緩沖區(qū)相對應(yīng)的。第9章C++語言的I/O流第9章C++語言的I/O流數(shù)據(jù)流分類:對系統(tǒng)指定的標(biāo)準(zhǔn)設(shè)備的輸入和輸出。以外存磁盤文件為對象進行輸入和輸出。對內(nèi)存中指定的空間進行輸入和輸出。重要的輸入流類:istream
ifstreamistrstream重要的輸出流類:ostreamofstreamostrstream1.通用I/O流類庫
使用這些功能時應(yīng)包含頭文件iostream.h。iosistreamostreamiostream提供流狀態(tài)設(shè)置功能提供從輸入流提取數(shù)據(jù)的操作第9章C++語言的I/O流2.文件I/O流類庫使用有關(guān)文件讀寫操作時,應(yīng)包含fstream.h文件。iosistreamostreamiostreamfstreambaseifstreamofstreamfstreamC++的I/O對C的發(fā)展——類型安全和可擴展性在C語言中,用printf和scanf進行輸入輸出,往往不能保證所輸入輸出的數(shù)據(jù)是可靠的、安全的。在C++的輸入輸出中,編譯系統(tǒng)對數(shù)據(jù)類型進行嚴(yán)格的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過編譯。因此C++的I/O操作是類型安全的。C++的I/O操作是可擴展的,不僅可以用來輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù),也可以用于用戶自定義類型的數(shù)據(jù)。在iostream頭文件定義了4種流對象cin是istream類的對象,用來處理標(biāo)準(zhǔn)輸入,即鍵盤輸入。cout是ostream類的對象,用來處理標(biāo)準(zhǔn)輸出,即屏幕輸出。Cerr是ostream類的對象,用來處理標(biāo)準(zhǔn)錯誤信息,沒有緩沖,發(fā)送給它的內(nèi)容立即被輸出。
clog是ostream類的對象,用來處理輸出信息,它提供打印機輸出。第9章C++語言的I/O流9.1.1使用預(yù)定義的插入符
這是一種最簡單的,也是最常用的方式。格式如下:
cout<<<表達式>“<<”在iostream頭文件中對它們進行了重載。如ostreamoperator<<(int);ostreamoperator<<(float);ostreamoperator<<(char);ostreamoperator<<(char*);9.1
屏幕輸出例分析下列程序的輸出結(jié)果。程序內(nèi)容如下:
#include<iostream.h>#include<string.h>voidmain(){cout<<"Thisisastring."<<endl;cout<<strlen("Thisisastring.")<<endl;}例分析下列程序的輸出結(jié)果。
#include<iostream.h>voidfun(int,int);voidmain(){fun(20,0);fun(205,5);}voidfun(inti,intj){if(j==0)cerr<<"zeroencountered.\n";elsecout<<i/j<<endl;}把一個字符寫到輸出流中。如:cout.put(′a′);參數(shù)可以是字符或ASCII碼
cout.put(65+32);連續(xù)調(diào)用put函數(shù)cout.put(71).put(79).put(79).put(68).put(′\n′);GOOD9.1.2使用成員函數(shù)put()輸出一個字符例分析下列程序的輸出結(jié)果。
#include<iostream.h>voidmain(){cout<<'H'<<'E'<<'L'<<'L'<<'O'<<endl;cout.put('H').put('E').put('L').put('L').put('O').put('\n');charc1='A',c2='B';inta=65;cout.put(c1).put(c2)<<endl;cout.put(char(a)).put(char(66))<<endl;}格式如下:
cout.write(constchar*str,intn)#include<iostream.h>#include<string.h>voidprint(char*s){cout.write(s,strlen(s)).put('\n');cout.write(s,6)<<endl;}voidmain(){char*str="IloveChina.";cout<<"Thestringis"<<str<<endl;print(str);}9.1.3使用成員函數(shù)write()輸出一個字符串9.2.1使用預(yù)定義的提取符格式如下:
cin>><變量名>從鍵盤上輸入數(shù)據(jù)是帶緩沖區(qū)的,輸入完數(shù)據(jù)按回車鍵時才形成輸入流。輸入流中數(shù)據(jù)項的默認(rèn)分隔符為空格、tab鍵、換行符等空白符。9.2
鍵盤輸入例分析下列程序的輸出結(jié)果。
#include<iostream.h>voidmain(){inti,j;cout<<"Enterij:";cin>>i>>j;cout<<cin<<endl;cout<<i<<','<<j<<endl;}例使用提取符從鍵盤上獲取整數(shù),判斷該數(shù)是大于0、小于0還是等于0,當(dāng)輸入非整數(shù)時退出程序。
#include<iostream.h>voidmain(){intn;cout<<"Enterainteger:";while(cin>>n){if(n>0)cout<<"n>0\n";elseif(n<0)cout<<"n<0\n";elsecout<<"n=0\n";}cout<<"nointeger!\n";}格式如下:
charistream::get() #include<iostream.h>voidmain(){charch;cout<<"Entercharactors:";while(ch=cin.get())!=EOFcout.put(ch);}9.2.2使用成員函數(shù)get()獲取一個字符
格式如下:
cin.getline(char*buf,intn,chardeline='\n')9.2.3使用成員函數(shù)getline()讀取一行字符例分析下列程序的輸出結(jié)果,該程序中使用了getline()函數(shù)。
#include<iostream.h>voidmain(){charbuf[80];intlcnt(0),lmax(-1);cout<<"Enter…:\n";while(cin.getline(buf,80)){intcount=cin.gcount();//返回getline實際上讀入的字符個數(shù)
lcnt++;if(count>lmax)lmax=count;cout<<"Line#"<<lcnt<<':'<<count<<endl;cout.write(buf,count).put('\n').put('\n');}cout<<"Largestline:"<<lmax<<endl;cout<<"Totalline:"<<lcnt<<endl;}格式如下:
cin.read(char*buf,intn)#include<iostream.h>voidmain(){charbuf[80]="";cout<<"Enter…:\n";cin.read(buf,80);cout<<buf<<endl;}9.2.4使用成員函數(shù)read()讀取若干字符使用流對象的成員函數(shù)使用操作子的方法C++共有15個輸入輸出格式標(biāo)記位,這15個標(biāo)記位均為bit位,每個標(biāo)記位都有自己的含義,且可以單獨設(shè)置。格式標(biāo)記位的取值為0或1:0表示關(guān)閉,1表示開啟。9.3格式化輸入和輸出9.3.1使用成員函數(shù)設(shè)置流的格式化標(biāo)志位標(biāo)記位含義boolalpha如開啟,則輸入和輸出使用bool值(即Ture或Falseshowbase如開啟,則對于輸出,使用C++基數(shù)前綴(0,0x)showpoint如開啟,則顯示末尾的小數(shù)點uppercase如開啟,則對于16進制,使用大寫字母;對于10進制,使用E表示法showpos
如開啟,則在正數(shù)前面加上+
1.控制輸入/輸出格式的標(biāo)志位1.控制輸入/輸出格式的標(biāo)志位標(biāo)記位含義dec如開啟,則使用基數(shù)10(進行輸出)oct如開啟,則使用基數(shù)8hex如開啟,則使用基數(shù)16fixed如開啟,則使用定點計數(shù)法scientific如開啟,則使用科學(xué)計數(shù)法left如開啟,則使用左對齊right如開啟,則使用右對齊internal如開啟,則符號或基數(shù)前綴左對齊,值右對齊1.控制輸入/輸出格式的標(biāo)志位標(biāo)記位含義skipws如開啟,則跳過輸入流中的空白字符unitbuf如開啟,則每次輸出操作后都會清空緩沖區(qū)uppercaseunitbuf
skipwsshowposshowpoint
showbase
scientificrightoctleftinternalhexfixeddecboolalpha001000000000010維護標(biāo)志字的成員函數(shù):longflags()該函數(shù)返回當(dāng)前標(biāo)志字。
longflag(long)該函數(shù)使用參數(shù)更新標(biāo)志字,返回更新前的標(biāo)志字。
longsetf(longsetbits,longfield)將field所指定的標(biāo)志位清零,將setbits所指的標(biāo)志位置1,并返回設(shè)置前的標(biāo)志字。
2.使用成員函數(shù)設(shè)置標(biāo)志位longsetf(long)該函數(shù)用來設(shè)置參數(shù)的指定的那些標(biāo)志位,并返回更新前的標(biāo)志字。
longunsetf(long)該函數(shù)用來清除參數(shù)所指定的那些標(biāo)志位,并返回更新前的標(biāo)志字。在IOS類中,定義了:staticconstlongbasefield其值為dec|oct|hexstaticconstlongajustfield其值為left|right|internalstaticconstlongfloatfield其值為scientific|fixed2.使用成員函數(shù)設(shè)置標(biāo)志位2.使用成員函數(shù)設(shè)置標(biāo)志位#include<iostream>usingnamespacestd;voidmain(){cout.setf(ios::oct,ios::basefield);cout<<“OCT:48”<<48<<endl;cout.setf(ios::dec,ios::basefield);cout<<“DEC:48”<<48<<endl;cout.setf(ios::hex,ios::basefield);cout<<“HEX:48”<<48<<endl;cout.setf(ios::showbase);cout<<“HEX:48”<<48<<endl;cout.setf(ios::uppercase);cout<<“HEX:254”<<254<<endl;}1)設(shè)置輸出數(shù)據(jù)所占寬度的成員函數(shù)
intwidth()該函數(shù)用來返回當(dāng)前輸出的數(shù)據(jù)寬度。
intwidth(int)該函數(shù)用來用設(shè)置當(dāng)前輸出的數(shù)據(jù)寬度,并返回更新前的寬度值。2)設(shè)置填充符的成員函數(shù)
charfill()該函數(shù)用來返回當(dāng)前所用的填充符。
charfill(char)該函數(shù)用來設(shè)置當(dāng)前的填充符,并返回更新前的填充符。9.3.2格式輸出函數(shù)3)設(shè)置浮點數(shù)輸出精度的成員函數(shù)
intprecision()該函數(shù)用來返回當(dāng)前浮點數(shù)的有效數(shù)字的個數(shù)。
intprecision(int)該函數(shù)用來設(shè)置當(dāng)前浮點數(shù)輸出時有效數(shù)字個數(shù),并返回更新前的值。9.3.2格式輸出函數(shù)
下面給出在默認(rèn)情況下的某些參數(shù)的值:①數(shù)據(jù)輸出寬度默認(rèn)情況下為實際寬度;②默認(rèn)情況下填空符為空格符;③單精度浮點數(shù)最多提供7位有效數(shù)字,雙精度浮點數(shù)最多提供15位有效數(shù)字,長雙精度浮點數(shù)最多提供19位有效數(shù)字。9.3.2格式輸出函數(shù)
#include<iostream.h>voidmain(){cout<<"12345678901234567890"<<endl;inti=12345;cout<<i<<endl;cout.width(10);cout<<i<<endl;cout.width(10);cout.fill('*');cout.setf(ios::left,ios::adjustfield);cout<<i<<endl;cout.setf(ios::right,ios::adjustfield);cout.precision(6);doubled=123.456789;cout<<d<<endl;cout.setf(ios::scientific,ios::floatfield);cout<<d<<endl;cout<<"width:"<<cout.width()<<endl;}使用操作子時需包含iomanip.h頭文件。操作子可以直接被插入符、提取符操作。9.3.3操作子流類庫所定義的操作子操作子名含義輸入/輸出dec數(shù)值數(shù)據(jù)采用十進制表示I/Ohex數(shù)值數(shù)據(jù)采用十六進制表示I/Ooct數(shù)值數(shù)據(jù)采用八進制表示I/Osetbase(intn)設(shè)置數(shù)制轉(zhuǎn)換基數(shù)為n(n為0,8,10,16)0表示使用默認(rèn)基數(shù)I/Ows提取空白符I流類庫所定義的操作子操作子名含義輸入/輸出ends插入空字符Oflush刷新與流相關(guān)聯(lián)的緩沖區(qū)Oresetiosflags(long)清除參數(shù)所指定的標(biāo)志位I/Osetiosflags(long)設(shè)置參數(shù)所指定的標(biāo)志位I/Osetfill(int)設(shè)置填充字符Osetprecision(int)設(shè)置浮點數(shù)輸出的有效數(shù)字個數(shù)Osetw(int)設(shè)置輸出數(shù)據(jù)項的域?qū)扥
#include<iostream.h>#include<iomanip.h>voidmain(){cout<<"12345678901234567890"<<endl;inti=12345;cout<<i<<endl;cout<<setw(10)<<i<<endl;cout<<resetiosflags(ios::right)<<setiosflags(ios::left)<<setfill('*')<<setw(10)<<i<<endl;doubled=123.456789;cout<<setfill('')<<setprecision(6)<<setw(10)<<d<<endl;cout.setf(ios::scientific,ios::floatfield);cout<<d<<endl;cout<<"width:"<<cout.width()<<endl;}9.4磁盤文件的輸入和輸出文件流是指磁盤文件流。操作:打開文件讀寫操作關(guān)閉文件磁盤文件文本文件二進制文件隨機文件1.打開文件打開文件通常分為兩步:先創(chuàng)建流對象再使用成員函數(shù)open()打開指定的文件。創(chuàng)建流對象方法:創(chuàng)建fstream類的對象創(chuàng)建ifstream類或ofstream類的對象。9.4.1磁盤文件的打開和關(guān)閉操作(1)創(chuàng)建fstream類對象打開文件的方法方法一:先創(chuàng)建對象,再打開文件
格式如下:
fstream<對象名>;<對象名>.open("<文件名>",<訪問方式>);1.打開文件文件訪問方式常量方式名用途in以輸入(讀)方式打開文件out以輸出(寫)方式打開文件app以輸出追加方式打開ate文件打開時,文件指針位于文件尾trunc如果文件存在,將其長度截斷為0,并清除原有內(nèi)容;如果文件不存在,則創(chuàng)建新文件binary以二進制方式打開文件,默認(rèn)時為文本方式文件訪問方式常量方式名用途nocreate打開一個已有文件,如該文件不存在,則打開失敗noreplace如果文件存在,除非設(shè)置ios::ate或ios::app,否則打開操作失敗ios::inlios::out以讀和寫的方式打開文件ios::outlios::binary以二進制寫方式打開文件ios::inlios::binary以二進制讀方式打開文件
方法二:創(chuàng)建對象和打開文件合二為一格式如下:
fstream<對象名>("<文件名>",<訪問方式>);1.打開文件1.打開文件(2)創(chuàng)建ifstream類對象或ofstream類對象打開文件的方法方法一:先創(chuàng)建對象,再打開文件格式如下:
ofstream<對象名>;<對象名>.open("<文件名>");
或者
ifstream<對象名>;<對象名>.open("<文件名>");1.打開文件方法二:創(chuàng)建對象同時打開文件格式如下:
ofstream<對象名>("<文件名>");或者
ifstream<對象名>("<文件名>");2.關(guān)閉文件格式如下:
<對象名>.close();先打開文件,打開文件時應(yīng)先創(chuàng)建流對象,打開文件時應(yīng)指出文件名和訪問方式;文件打開后才可以進行讀寫操作;操作完畢后還要關(guān)閉文件。9.4.2文本文件的讀寫操作例編程將一些字符信息寫入到指定的文件中。
#include<iostream.h>#include<fstream.h>#include<stdlib.h>voidmain(){fstreamout;out.open("f1.txt",ios::out);if(!out){cerr<<"f1.txtcan'topen.\n";abort();}out<<"thisisastring.\n";out<<"thisisaprogram.\n";out<<"ok!\n";out.close();}例編程從一個文本文件中讀出的存放的信息。
#include<iostream.h>#include<fstream.h>#include<stdlib.h>voidmain(){fstreamin;in.open("f1.txt",ios::in);if(!in){cerr<<"f1.txtcan'topen.\n";abort();}chars[80];while(!in.eof()){in.getline(s,sizeof(s));cout<<s<<endl;}in.close();}例編程將一個文件的內(nèi)容復(fù)制到另一個文件中。
#include<iostream.h>#include<fstream.h>#include<stdlib.h>voidmain(){fstreaminfile,outfile;infile.open("f2.txt",ios::in);if(!infile){cerr<<"f2.txtcan'topen.\n";abort();}outfile.open("f3.txt",ios::out);if(!outfile){cerr<<"f3.txtcan'topen.\n";abort();}charch;while(infile.get(ch))outfile.put(ch);infile.close();outfile.close();}二進制文件的讀寫操作與文本文件的讀寫操作基本相同;區(qū)別在于二進制文件來說打開時需要加上ios::binary方式。用于二進制文件讀寫函數(shù)通常使用read()函數(shù)和write()函數(shù)。9.4.3二進制文件的讀寫操作例分析下列程序的輸出結(jié)果,熟悉二進制文件的使用方法。
#include<iostream.h>#include<fstream.h>#include<stdlib.h>structperson{charname[20];doubleheight;unsignedshortage;};personpeople[5]={"Li",1.88,35, "Hu",1.91,25, "Gao",1.75,33, "Mao",1.72,32,
"Lu",1.69,50};
voidmain(){fstreamfile;file.open("f5.dat",ios::in|ios::out|ios::binary);if(!file){cerr<<"f5.datcan'topen.\n";abort();}for(inti(0);i<5;i++)file.write((char*)&people[i],sizeof(people[i]));file.seekp(0,ios::beg);for(i=0;i<5;i++){file.read((char*)&people[i],sizeof(people[i]));cout<<people[i].name<<'\t'<<people[i].height
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年甘肅建筑職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試題庫參考答案詳解
- 2026年河南林業(yè)職業(yè)學(xué)院單招職業(yè)傾向性測試題庫及完整答案詳解1套
- 2026年山西衛(wèi)生健康職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫帶答案詳解
- 2026年遼源職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試題庫參考答案詳解
- 2026年山東文化產(chǎn)業(yè)職業(yè)學(xué)院單招職業(yè)技能測試題庫參考答案詳解
- 2026年蘭州資源環(huán)境職業(yè)技術(shù)大學(xué)單招綜合素質(zhì)考試題庫帶答案詳解
- 上市銀行面試題庫及答案
- 水電站渠道加固承包協(xié)議書范本
- 2025年北京郵電大學(xué)人工智能學(xué)院招聘備考題庫(人才派遣)及完整答案詳解1套
- 2025年崇州市人民醫(yī)院醫(yī)共體成員單位自主招聘(補充招聘)備考題庫及答案詳解一套
- 2025年谷胱甘肽及酵母提取物合作協(xié)議書
- 2026廣西融資擔(dān)保集團校園招聘補充參考筆試題庫及答案解析
- 2026貴州安創(chuàng)數(shù)智科技有限公司社會公開招聘119人參考筆試題庫及答案解析
- 韓家園林業(yè)局工勤崗位工作人員招聘40人備考題庫新版
- 2025年云南省人民檢察院聘用制書記員招聘(22人)參考筆試題庫及答案解析
- 維修班組長設(shè)備故障應(yīng)急處理流程
- 2026年湖南司法警官職業(yè)學(xué)院單招職業(yè)技能測試題庫及完整答案詳解1套
- 兔年抽紅包課件
- DB31∕T 634-2020 電動乘用車運行安全和維護保障技術(shù)規(guī)范
- 醫(yī)師證租借協(xié)議書
- 2025年11月國家注冊質(zhì)量審核員(QMS)審核知識考試題(附答案)
評論
0/150
提交評論