C實(shí)用教程鄭阿奇主編.ppt
第14章輸入/輸出流,14.1概述,14.1.1流和流類,在C+中,輸入/輸出操作是由“流”來處理的。流是C+的一個(gè)核心概念,數(shù)據(jù)從一個(gè)位置到另一個(gè)位置的流動抽象為流。,14.1.2標(biāo)準(zhǔn)流對象,C+提供了4個(gè)預(yù)定義的標(biāo)準(zhǔn)流對象:cin、cout、cerr和clog,它們都是std名稱空間的流對象。其中,cin是istream類的對象,用來處理標(biāo)準(zhǔn)輸入,即鍵盤輸入;cout是ostream類的對象,用來處理標(biāo)準(zhǔn)輸出,即屏幕輸出;cerr和clog都是ostream類的對象,用來處理標(biāo)準(zhǔn)出錯(cuò)信息,并將信息顯示在屏幕上,14.1.3提取和插入運(yùn)算符重載,#includeusingnamespacestd;classCStudent;ostream,ostream,14.2格式控制和錯(cuò)誤處理,兩種格式控制方式:一種是使用ios類中的相關(guān)成員函數(shù),如width()、presision()和fill()等;另一種是直接使用的格式操作算子,如oct、hex和dec等,14.2.1設(shè)置輸出寬度和填充字符,#include#include/必須要有此頭文件包含usingnamespacestd;intmain()intnNum=1234;doublefNum=12.3456;cout<<"1234567890"<<endl;cout<<setw(10)<<nNum<<n;cout<<setw(10)<<nNum<<-<<fNum<<endl;cout<<setw(10)<<nNum<<setw(10)<<fNum<<endl;cout<<setw(10)<<setfill(#)<<nNum<<endl;cout<<setw(10)<<fNum<<endl;return0;,14.2.2控制實(shí)數(shù)顯示,#include#includeusingnamespacestd;intmain()doubled=13.0/17.0;cout<<d<<endl;cout<<setprecision(1)<<d<<endl<<setprecision(0)<<d<<endl<<setprecision(3)<<d<<endl<<setprecision(5)<<d<<endl<<10.0<<endl;cout<<setiosflags(ios:scientific)<<d<<endl<<d*10.0<<endl;cout<<setprecision(6)<<setiosflags(ios:scientific)<<d<<endl;cout<<setiosflags(ios:fixed)<<d<<endl;return0;,14.2.3左右對齊輸出,例Ex_Left數(shù)據(jù)的對齊方式示例。#include#includeusingnamespacestd;intmain()intnNum=1234;cout<<"1234567890"<<setfill(#)<<endl;cout<<setw(10)<<nNum<<endl;cout<<setw(10)<<-nNum<<endl;cout<<setiosflags(ios:left)<<setw(10)<<nNum<<endl;cout<<setw(10)<<-nNum<i;s=cin.rdstate();cout>i;s=cin.rdstate();return0;,14.3使用輸入/輸出成員函數(shù),如果想要使輸入/輸出控制更為細(xì)致,如希望把輸入的空格作為一個(gè)字符而不是分隔符,就需要使用istream類和ostream類中的相關(guān)成員函數(shù)。,14.3.1輸入操作的成員函數(shù),(1)使用get和getline函數(shù)用于輸入字符或字符串的成員函數(shù)get原型如下:intget();istream第一種形式是從輸入流中提取一個(gè)字符,并轉(zhuǎn)換成整型數(shù)值。第二種形式是從輸入流中提取字符到rch中。第三種形式是從輸入流中提取一個(gè)字符串并由pch返回,例Ex_GetAndGetLineget和getline的使用示例。,#includeusingnamespacestd;intmain()chars180,s280,s380;cout<<"請輸入一個(gè)字符:"cout<<cin.get()<<endl;cin.get();/提取換行符cout<<"請輸入一行字符串:"for(inti=0;i<80;i+)cin.get(s1i);if(s1i=n)s1i=0;break;/退出for循環(huán)cout<<s1<<endl;cout<<"請輸入一行字符串:"cin.get(s2,80);cout<<s2<<endl;cin.get();/提取換行符cout<<"請輸入一行字符串:"cin.getline(s3,80);cout<<s3<<endl;return0;程序運(yùn)行結(jié)果如下:,(2)使用read函數(shù)。read函數(shù)不僅可以讀取字符或字符串(稱為文本流),而且可以讀取字節(jié)流。其原型如下:istream,例Ex_Readread函數(shù)的使用示例。,#includeusingnamespacestd;intmain()chardata80;cout<<"請輸入:"<<endl;cin.read(data,80);datacin.gcount()=0;cout<<endl<<data<<endl;return0;程序運(yùn)行結(jié)果如下:,14.3.2輸出操作的成員函數(shù),ostream類中用于輸出的成員函數(shù)有put和write,它們的原型如下:ostream,14.4文件流,C+中,“文件”有兩種含義,一種是指一個(gè)具體的外部設(shè)備,稱為設(shè)備文件,如可以把打印機(jī)看作一個(gè)文件,也可把屏幕看成一個(gè)文件;另一種是指一個(gè)磁盤文件,即存放在磁盤上的文件,每個(gè)文件都有一個(gè)文件名。無論是設(shè)備文件還是磁盤文件,在C+中都看成是文件流,并提供了相應(yīng)的流庫。,14.4.1文件和文件流概述,無論是文本文件還是二進(jìn)制文件,都需要用文件指針來操縱。一個(gè)文件指針總是和一個(gè)文件相關(guān)聯(lián)C+提供了文件操作的文件流庫,14.4.2文件流的使用方法,文件操作一般是按定義文件流對象、打開文件、讀/寫文件、關(guān)閉文件這4個(gè)步驟進(jìn)行的1.定義文件流對象文件的操作通常有三種方式,即只讀、只寫和讀寫方式Xstream對象;,2.使用成員函數(shù)open打開文件打開文件有兩種方式:一種是調(diào)用文件流成員函數(shù)open,另一種是在定義文件流對象時(shí)通過構(gòu)造函數(shù)打開文件第一種打開方式,使用成員函數(shù)open打開文件在ifstream、ofstream或fstream類中,都有一個(gè)成員函數(shù)open,3.使用構(gòu)造函數(shù)打開文件在使用成員函數(shù)open打開文件時(shí),需要先定義一個(gè)文件流對象4.文件的讀/寫文件打開后,對文件的讀/寫操作也有兩種方法。第1種方法是使用提取運(yùn)算符或插入運(yùn)算符對文件進(jìn)行讀/寫操作第2種方法是使用成員函數(shù)get、getline、read、put、write進(jìn)行文件的讀/寫操作,說明:,(1)若進(jìn)行文件復(fù)制操作,則可在程序中先打開源文件與目標(biāo)文件,然后用循環(huán)語句(2)對于文件結(jié)尾的判定還可以使用基類ios中的成員函數(shù)eof,其原型如下:intios:eof();當(dāng)?shù)竭_(dá)文件結(jié)束位置時(shí),該函數(shù)返回非0值,否則返回0,5.關(guān)閉文件打開一個(gè)文件且對文件進(jìn)行讀/寫操作后,應(yīng)調(diào)用文件流的成員函數(shù)來關(guān)閉相應(yīng)的文件,14.4.3順序文件操作,#include#include/文件操作必須的頭文件usingnamespacestd;intmain()fstreamfile1;/定義一個(gè)fstream類的對象用于讀file1.open("Ex_DataFile.txt",ios:in);if(!file1)cout<<"Ex_DataFile.txt不能打開!n"return1;fstreamfile2;/定義一個(gè)fstream類的對象用于寫file2.open("Ex_DataFileBak.txt",ios:out|ios:trunc);if(!file2)cout<<"Ex_DataFileBak.txt不能創(chuàng)建!n"file1.close();return1;,charch;while(!file1.eof()file1.read(程序運(yùn)行結(jié)果如下:,14.4.4隨機(jī)文件操作,用戶可根據(jù)具體的讀/寫操作情況使用C+提供的seek函數(shù)將文件指針移動到指定的位置。但在VisualC+中文件指針的定位是通過seekg與seekp成員函數(shù)來實(shí)現(xiàn)的,seekg函數(shù)用于移動輸入文件流中的文件指針,seekp函數(shù)用于移動輸出文件流中的文件指針,它們又可分為絕對定位和相對定位兩種操作。1.絕對定位用于文件指針絕對定位的seekg和seekp成員函數(shù)原型如下:istream,例Ex_AbsLoc文件指針的絕對定位示例,#include#include/文件操作的頭文件usingnamespacestd;intmain()charch,str="ABCDEFGHIJK"ofstreamoutfile("letter.dat");/用構(gòu)造函數(shù)打開文件letter.datif(!outfile)cout<<"不能打開目標(biāo)文件:letter.dat!"<<endl;exit(1);outfile.write(str,strlen(str);/將字符串str寫入letter.dat文件緩沖區(qū)outfile.flush();/將緩沖區(qū)中字符串寫入磁盤文件中ifstreaminfile("letter.dat");/用構(gòu)造函數(shù)打開文件letter.datif(!infile)cout<<"不能打開源文件:letter.dat!"<<endl;exit(1);,infile.seekg(2);/將文件指針移到第2個(gè)字節(jié)后infile.read(程序運(yùn)行結(jié)果如下:,2.相對定位相對定位是指文件指針相對于某個(gè)位置向前移動或向后移動n個(gè)字節(jié),它是由seekg和seekp成員函數(shù)的另一個(gè)版本來實(shí)現(xiàn)的,其函數(shù)原型如下:istream,例Ex_RelLoc文件指針的相對定位示例。,#include#include/文件操作的頭文件usingnamespacestd;intmain()charchs,che,str="ABCDEFGHIJK"fstreamiofile("letter.dat",ios:in|ios:out);/用構(gòu)造函數(shù)打開letter.dat用于讀/寫if(!iofile)cout<<"不能打開目標(biāo)文件:letter.dat!"<<endl;exit(1);iofile.write(str,strlen(str);/將字符串str寫入letter.dat文件緩沖區(qū)iofile.flush();/將緩沖區(qū)中字符串寫入磁盤文件中iofile.seekg(0,ios:beg);longnStart=iofile.tellg();/獲取文件流的最前面位置iofile.seekg(0,ios:end);longnEnd=iofile.tellg();/獲取文件流的末尾位置longnPos=0;,while(nStart<nEnd)iofile.seekg(nPos,ios:beg);/從頭開始向后讀取nStart=iofile.tellg();iofile.read(,14.5綜合應(yīng)用實(shí)例,#include#include#include#include#includeusingnamespacestd;classCStudent;ostream,classCStudentpublic:CStudent()CStudent(char*name,char*id,floats1,floats2,floats3);voidprint(intn=-1);char*GetName();friendostream,voidCStudent:print(intn)/n為序號,0)cout0)cout<<setw(6)<<n;cout<<setw(22)<<strName<<setw(12)<<strID<<setw(10)<<fScore0<<setw(10)<<fScore1<<setw(10)<<fScore2<stu)if(strncmp(name,stu.GetName(),strlen(name)=0)nRec=i;break;i+;returnnRec;,voidCStuFile:list()/列表顯示CStudentstu;/將文件指針定位到文件頭,然后顯示thefile.clear();/清除內(nèi)部標(biāo)志thefile.seekg(0);inti=0;while(thefile>>stu)stu.print(i+1);i+;intmain()CStuFiletheFile("student.dat");CStudentstu1("MaWenTao","99001",88,90,75.5);CStudentstu2("LiMing","99002",92,80,81.5);CStudentstu3("WangFang","99003",89,70,78);CStudentstu4("YangYang","99004",90,80,90);CStudentstu5("DingNing","99005",80,78,85);theFile.add(stu1);theFile.add(stu2);theFile.add(stu3);theFile.add(stu4);theFile.add(stu5);theFile.list();CStudentstu;intnRec=theFile.seek("LiMing",stu);if(nRec>=0)cout<<"找到的結(jié)果為:"<<endl;stu.print(nRec+1);elsecout<<"沒有找到!"<<endl;return0;,程序運(yùn)行結(jié)果如下:,