程序設計基礎:10第十章 C++的輸入輸出
合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1第十章第十章 C+的輸入輸出的輸入輸出 流流 文件文件 文件流的使用:文件的輸入和輸出文件流的使用:文件的輸入和輸出合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院210.1 C+語言的輸入語言的輸入/輸出輸出10.1.1 外部外部設備與文件與文件外部外部設備:n存存儲設備:存:存儲信息,信息,塊設備(字符(字符塊)介介質(zhì):硬:硬盤、軟盤、磁、磁帶、光、光盤、組織:文件:文件n輸入入/輸出出設備:輸入入/輸出信息,字符出信息,字符設備 輸入:入:鍵盤、鼠、鼠標、掃描描儀、輸出:出:顯示器、打印機、示器、打印機、繪圖儀、合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院310.1 C+語言的輸入語言的輸入/輸出輸出10.1.1 外部外部設備與文件與文件文件(文件(file):):n作作為輸入入/輸出的出的對象象n與外部與外部設備之之間建立關建立關聯(lián),作,作為輸入入/輸出出設備的抽象描述的抽象描述 文件:必文件:必須有一個由用有一個由用戶命名的唯一名字,可用于存命名的唯一名字,可用于存儲程程序和數(shù)據(jù),序和數(shù)據(jù),還可用于提高程序的可用于提高程序的設備無關性(獨立于無關性(獨立于設備的的類型、臺號)。型、臺號)。輸入入輸出系出系統(tǒng):特殊的文件,由操作系:特殊的文件,由操作系統(tǒng)預先先規(guī)定,如:定,如:CON:控制臺:控制臺終端端 PRN:打印機:打印機合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院410.1 C+語言的輸入語言的輸入/輸出輸出10.1.2 程序中程序中對文件的操作文件的操作程序程序 外部外部設備 文件系文件系統(tǒng):操作系:操作系統(tǒng)(operating system)operating system)提供的一系列系提供的一系列系統(tǒng)調(diào)用(用(system callsystem call)接口。)接口。文件文件緩沖區(qū):由操作系沖區(qū):由操作系統(tǒng)設置置 程序程序設計語言的言的輸入入輸出機制:建立在系出機制:建立在系統(tǒng)調(diào)用基用基礎上的上的抽象抽象層次更高的機制(函數(shù)次更高的機制(函數(shù)庫、類庫)文件系統(tǒng)文件系統(tǒng)合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院510.1 C+語言的輸入語言的輸入/輸出輸出10.1.2 程序中程序中對文件的操作文件的操作C+C+語言提供了言提供了流流用于用于讀寫文件寫文件。接收接收輸出數(shù)據(jù)的地方稱出數(shù)據(jù)的地方稱為目目標,發(fā)出出輸入數(shù)據(jù)的地方稱入數(shù)據(jù)的地方稱為源源。輸入入輸出操作可以看作是字符序列在源、目出操作可以看作是字符序列在源、目標與與對象之象之間的流的流動,因而將完成,因而將完成輸入入輸出操作的出操作的類稱稱為流流類。源流源流目目標流流 輸入入緩沖區(qū)沖區(qū)(讀)輸出出緩沖區(qū)沖區(qū)(寫寫)流的提取運算符流的提取運算符 流的插入運算符流的插入運算符”和和”提取符提取符 在在類istream中定中定義。輸出:向流中插入一個字符序列,出:向流中插入一個字符序列,“”插入符插入符 在在類ostream中定中定義。流與物理流與物理設備的關的關聯(lián):鍵盤、顯示器、示器、四個四個預定定義的流的流對象:象:cin:標準準輸入,缺省入,缺省為鍵盤cout:標準準輸出,缺省出,缺省為顯示器示器cerr:無無緩沖的沖的標準準錯誤輸出,缺省出,缺省為顯示器示器clog:有有緩沖的沖的標準準錯誤輸出,缺省出,缺省為顯示器示器合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1010.2 C+的流類庫的流類庫10.2.3 支持文件的流支持文件的流類頭文件:文件:fstream.hiosistreamostreamiostreamstreambuffilebuffstreambaseifstreamofstreamfstream合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1110.2 C+的流類庫的流類庫10.2.4 支持字符串的流支持字符串的流類頭文件:文件:strstrea.h 字符串流:在流與字符串之字符串流:在流與字符串之間建立建立連接接iosistreamostreamiostreamstreambufstrstreambufstrstreambaseistrstreamostrstreamstrstream合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1210.3 格式化輸入輸出格式化輸入輸出10.3.1 使用使用ios成成員函數(shù)函數(shù)格式化格式化標志字(志字(formatting flag):long x_flag;在在iostream.h中的中的ios類定定義中,中,說明了如下的枚明了如下的枚舉:enum /formatting flags skipws =0 x0001,/skip whitespace on input left =0 x0002,/left-adjust output right =0 x0004,/right-adjust output internal =0 x0008,/padding after sign or base indicator dec =0 x0010,/decimal conversion oct =0 x0020,/octal conversion hex =0 x0040,/hexadecimal conversion showbase =0 x0080,/use base indicator on output showpoint =0 x0100,/force decimal point(floating output)uppercase =0 x0200,/upper-case hex output showpos =0 x0400,/add+to positive integers scientific =0 x0800,/use 1.2345E2 floating notation fixed =0 x1000,/use 123.45 floating notation unitbuf =0 x2000,/flush all streams after insertion stdio =0 x4000,/flush stdout,stderr after insertion boolalpha =0 x8000 /insert/extract bools as text or numeric ;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1310.3 格式化輸入輸出格式化輸入輸出10.3.1 使用使用ios成成員函數(shù)函數(shù)0/10/10/10/10/10/10/10/10/10/10/10/10/10/10/1skipwsleftrightdechexshowpointshowposfixedstdiointernaloctshowbaseuppercasescientificunitbuf合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1410.3 格式化輸入輸出格式化輸入輸出10.3.1 使用使用ios成員函數(shù)成員函數(shù)常量名常量名意義意義輸入輸入/輸出輸出skipws 若設置,跳過輸入中的空白;否則,則不舍去這些空白若設置,跳過輸入中的空白;否則,則不舍去這些空白 i left輸出數(shù)據(jù)按輸出域左邊對齊輸出輸出數(shù)據(jù)按輸出域左邊對齊輸出oright輸出數(shù)據(jù)按輸出域右邊對齊輸出輸出數(shù)據(jù)按輸出域右邊對齊輸出 ointernal輸出數(shù)據(jù)在輸出域中符號或基指示符左對齊,數(shù)字右對齊輸出數(shù)據(jù)在輸出域中符號或基指示符左對齊,數(shù)字右對齊 odec以十進制形式顯示數(shù)據(jù)以十進制形式顯示數(shù)據(jù) i/ooct以八進制形式顯示數(shù)據(jù)以八進制形式顯示數(shù)據(jù) i/ohex以十六進制形式顯示數(shù)據(jù)以十六進制形式顯示數(shù)據(jù) i/oshowbase輸出帶有一個表示制式的輸出帶有一個表示制式的“基指示符基指示符”,如對十六進制,將加,如對十六進制,將加上上0 x oshowpoint浮點輸出時必須帶有一個小數(shù)點浮點輸出時必須帶有一個小數(shù)點 ouppercase以大寫形式顯示數(shù)據(jù)中的字母以大寫形式顯示數(shù)據(jù)中的字母 oshowpos在顯示的正數(shù)前加上一個在顯示的正數(shù)前加上一個+oscientific以科學記數(shù)法顯示浮點數(shù)以科學記數(shù)法顯示浮點數(shù) ofixed以十進制小數(shù)方式顯示浮點數(shù)以十進制小數(shù)方式顯示浮點數(shù) ounitbuf在插入操作后立即刷新流的緩沖區(qū)在插入操作后立即刷新流的緩沖區(qū) ostdio在插入操作后刷新在插入操作后刷新stdout和和stderr o合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1510.3 格式化輸入輸出格式化輸入輸出10.3.1 使用使用ios成員函數(shù)成員函數(shù)long flags()設置標志值,并返回以前所設置的標志值設置標志值,并返回以前所設置的標志值flags()僅返回當前的標志值僅返回當前的標志值long setf(long,long)用于設置標志字的某一位,第二個參數(shù)指定所要操作的位,用于設置標志字的某一位,第二個參數(shù)指定所要操作的位,第一個參數(shù)指定為該位所設置的值。第一個參數(shù)指定為該位所設置的值。long setf(long)設置參數(shù)所指定的那些標志位設置參數(shù)所指定的那些標志位long unsetf(long)清除參數(shù)指定的標志位清除參數(shù)指定的標志位int width(int)指定域?qū)?,并返回以前設置的域?qū)捴付ㄓ驅(qū)挘⒎祷匾郧霸O置的域?qū)抜nt width()僅返回當前域?qū)拑H返回當前域?qū)抍har fill(char)設置填充字符,缺省為空格。函數(shù)返回以前設置的填充字設置填充字符,缺省為空格。函數(shù)返回以前設置的填充字符符char fill()僅返回當前的填充字符僅返回當前的填充字符int precision(int)設置小數(shù)點后的數(shù)據(jù)位數(shù),返回以前設置的位數(shù)設置小數(shù)點后的數(shù)據(jù)位數(shù),返回以前設置的位數(shù)int precision()僅返回當前的小數(shù)點數(shù)據(jù)位數(shù)僅返回當前的小數(shù)點數(shù)據(jù)位數(shù)合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1610.3 格式化輸入輸出格式化輸入輸出10.3.1 使用使用ios成成員函數(shù)函數(shù)例:例:/程序:程序:IOS_FMT.cpp/功能:演示利用功能:演示利用ios成成員函數(shù)函數(shù)進行格式化行格式化輸出出#include /以二以二進制形式制形式輸出當前格式控制出當前格式控制標識字字flagvoid show_flag(long flag)long mask;/用于屏蔽其他位,取出當前位的循用于屏蔽其他位,取出當前位的循環(huán)變量量cout=0 x0001;mask=mask1)if(flag&mask)cout1;else cout0;cout)n;return;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1710.3 格式化輸入輸出格式化輸入輸出10.3.1 使用使用ios成成員函數(shù)函數(shù)int main()long f;f=cout.flags();/按缺省方式按缺省方式輸出出show_flag(cout.flags();/取當前格式取當前格式標識字并以二字并以二進制制輸出出cout123n;cout123.456n;/按科學按科學記數(shù)法數(shù)法輸出,并在正數(shù)前另加上出,并在正數(shù)前另加上“+”符號符號cout.setf(ios:showpos|ios:scientific);show_flag(cout.flags();cout123n;cout123.456n;cout.unsetf(ios:showpos|ios:scientific);/取消取消剛才才設置的狀置的狀態(tài)合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1810.3 格式化輸入輸出格式化輸入輸出10.3.1 使用使用ios成成員函數(shù)函數(shù) /強制浮點數(shù)按照定點格式制浮點數(shù)按照定點格式顯示示cout.setf(ios:fixed);show_flag(cout.flags();cout0.001234567n;cout.unsetf(ios:fixed);/按大寫的十六按大寫的十六進制制輸出,并在數(shù)據(jù)前加上十六出,并在數(shù)據(jù)前加上十六進制的基制的基“0X cout.setf(ios:hex|ios:showbase|ios:uppercase);show_flag(cout.flags();cout123n;cout123.456n;cout.unsetf(ios:hex|ios:showbase|ios:uppercase);/設置置輸出數(shù)據(jù)出數(shù)據(jù)寬度度show_flag(cout.flags();cout;cout.width(15);cout123n;cout123.456n;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院1910.3 格式化輸入輸出格式化輸入輸出10.3.1 使用使用ios成成員函數(shù)函數(shù) /設設置左置左對齊對齊,并且,并且寬寬度不足度不足則則以符號以符號“#”填充填充cout.fill(#);cout.setf(ios:left);show_flag(cout.flags();cout;cout.width(15);cout123n;cout123.456n;cout.unsetf(ios:left);/設設置符號位左置符號位左對齊對齊,數(shù),數(shù)值值右右對齊對齊,寬寬度不足以空格填充度不足以空格填充cout.fill();cout.setf(f);cout.setf(ios:internal);show_flag(cout.flags();cout;cout.width(15);cout-123n;cout.unsetf(ios:internal);合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2010.3 格式化輸入輸出格式化輸入輸出10.3.1 使用使用ios成成員函數(shù)函數(shù) /設設置置輸輸出精度出精度為為小數(shù)點后兩位數(shù)字小數(shù)點后兩位數(shù)字cout.setf(ios:fixed);show_flag(cout.flags();cout123n;cout.precision(2);cout123.456n;return 0;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2110.3 格式化輸入輸出格式化輸入輸出10.3.2 使用使用輸入入輸出操出操縱符符 操操縱符(符(manipulator):特殊的函數(shù),可直接包含在):特殊的函數(shù),可直接包含在輸入入/輸出表達式中。出表達式中。不不帶形式參數(shù)的操形式參數(shù)的操縱符定符定義在在 iostream.h 中中 帶形式參數(shù)的操形式參數(shù)的操縱符定符定義在在 iomanip.h 中中 合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2210.3 格式化輸入輸出格式化輸入輸出10.3.2 使用輸入輸出操縱符使用輸入輸出操縱符 操縱符操縱符功能功能輸入輸入/輸出輸出dec格式為十進制數(shù)據(jù)格式為十進制數(shù)據(jù)i/ohex格式為十六進制數(shù)據(jù)格式為十六進制數(shù)據(jù)i/ooct格式為八進制數(shù)據(jù)格式為八進制數(shù)據(jù)i/osetbase(int n)設置數(shù)據(jù)的基為設置數(shù)據(jù)的基為n(n為為0、8、10、16),),0表示使用表示使用缺省值缺省值osetioflags(long)設置特定的標志位設置特定的標志位i/oresetiosflags(long)清除特定的標志位清除特定的標志位i/ows設置跳過輸入中的前導空白字符設置跳過輸入中的前導空白字符Isetw(int)設置域?qū)捲O置域?qū)抩setprecision(int)設置浮點輸出的有效數(shù)字個數(shù)設置浮點輸出的有效數(shù)字個數(shù)osetfill(int)設置填充字符設置填充字符oendl插入一個換行符并刷新此流插入一個換行符并刷新此流oends插入一個空字符插入一個空字符oflush刷新流刷新流o合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2310.3 格式化輸入輸出格式化輸入輸出10.3.2 使用使用輸入入輸出操出操縱符符#include#include int main()char input_string250;/按大寫十六按大寫十六進制制輸出出coutsetiosflags(ios:uppercase)hex123decendl;/輸出浮點數(shù)的精度出浮點數(shù)的精度為小數(shù)點后兩位小數(shù)點后兩位coutsetprecision(5)123.456endl;/輸出的字符串的出的字符串的寬度度為15coutsetw(15)Helloendl;/以以“*”填充填充寬度度為15 的數(shù)據(jù)空白的數(shù)據(jù)空白處coutsetw(15)setfill(*)10000endl;/忽略忽略輸入之前的空白入之前的空白coutwsinput_string;coutinput_stringendl;return 0;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2410.3 格式化輸入輸出格式化輸入輸出10.3.3 格式化格式化輸入入/輸出到字符串出到字符串字符串作字符串作為輸入流:入流:創(chuàng)建建 istrstream 對象象/程序:程序:IN_STR.CPP/功能:將字符串的內(nèi)容作功能:將字符串的內(nèi)容作為輸入流入流#includeint main()char str=1234;istrstream buffer1(str);/將整個字符串作將整個字符串作為輸入流入流istrstream buffer2(str,2);/將字符串前兩個字符作將字符串前兩個字符作為輸入流入流int i,j;buffer1i;buffer2j;couti+jendl;return 0;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2510.3 格式化輸入輸出格式化輸入輸出10.3.3 格式化格式化輸入入/輸出到字符串出到字符串字符串作字符串作為輸出流:出流:創(chuàng)建建 ostrstream 對象象/程序:程序:out_STR.CPP/功能:將數(shù)據(jù)格式化功能:將數(shù)據(jù)格式化輸出到字符串中出到字符串中#include#includeint main()ostrstream buffer;char*str;/將數(shù)據(jù)格式化將數(shù)據(jù)格式化輸出到出到輸出流出流buffer,注意字符串,注意字符串結束符束符0buffer Salary is setw(10)setfill($)725.5ends;/輸出的出的結果用果用buffer.str()來來訪問str=buffer.str();coutstrendl;return 0;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2610.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.1 put成成員函數(shù)函數(shù)ostream類和和istream類提供的成提供的成員函數(shù)函數(shù)輸出:出:put、write輸出:出:get、read、gcount、getline、peek、putback、ignore可可實現(xiàn)無格式的無格式的輸入入/輸出出cout.put(char)例:例:cout.put(A);cout.put(65);cout.put(A.put(n);cout.put(A).put(n);合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2710.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.2 write成成員函數(shù)函數(shù)cout.write(char*,int)例:例:char buffer=“HAPPY BIRTHDAY”cout.write(buffer,10);10.4.3 read和和gcount成成員函數(shù)函數(shù)cin.read(char*,int)將指定數(shù)量的字符將指定數(shù)量的字符輸入到內(nèi)存中的字符數(shù)入到內(nèi)存中的字符數(shù)組int cin.gcount(void)返回最后一次返回最后一次輸入操作入操作讀取的字符數(shù)取的字符數(shù)合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2810.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.3 read和和gcount成成員函數(shù)函數(shù)/程序:程序:UN_FMT.CPP/功能:用功能:用write、read和和gcount成成員函數(shù)函數(shù)實現(xiàn)無格式無格式輸入入輸出出#includeint main()const int SIZE=80;char bufferSIZE=Enter a sentence:;coutbufferendl;cin.read(buffer,20);coutendl The sentence entered was:endl;cout.write(buffer,cin.gcount();coutendl;return 0;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院2910.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.4 get成成員函數(shù)函數(shù) istream.h中中get原型原型 int get();/從從輸入流中入流中讀入一個字符,返回入一個字符,返回該字符作字符作為函數(shù)函數(shù)調(diào)用用值,遇到文件遇到文件結束符,返回束符,返回EOF EOF:文件:文件結束符,束符,為符號常量,符號常量,值為-1 istream&get(char&);/從指定從指定輸入流中入流中讀入一個字符,入一個字符,賦給字符字符變量量ch,遇到文件,遇到文件結束符,返回束符,返回0 inline istream&get(unsigned char&);inline istream&get(signed char&);inline istream&get(char*,int,char=n);/從指定從指定輸入流中入流中讀int個字符,函數(shù)在個字符,函數(shù)在讀到比到比int少一個字符或遇到字符少一個字符或遇到字符char為止(止(char缺省缺省為n),并),并補上字符串上字符串結束符束符0。inline istream&get(unsigned char*,int,char=n);inline istream&get(signed char*,int,char=n);合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院3010.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.4 get成成員函數(shù)函數(shù)/程序:程序:GET.CPP/功能:演示功能:演示get函數(shù)的幾種用法函數(shù)的幾種用法#include int main()const int SIZE=80;char ch;int character;char buffer1SIZE,buffer2SIZE;/用不用不帶帶參數(shù)的參數(shù)的get函數(shù)函數(shù)輸輸入字符,以文件入字符,以文件結結束符束符終終止,并用止,并用put函數(shù)函數(shù)輸輸出出cout Enter a sentence follwed by end-of-file:endl;while(character=cin.get()!=EOF)cout.put(char)character);cout EOF in this sysytem is:characterendl;cout After input,cin.eof()is:cin.eof()endlendl;cin.clear();/清除清除輸輸入流不正常入流不正常標記標記 合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院3110.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.4 get成成員函數(shù)函數(shù) /使用使用get(ch)函數(shù)函數(shù)輸輸入,以文件入,以文件結結束符束符終終止,用止,用put(ch)輸輸出出cout Enter a sentence with get(ch)and output pur(ch):n;while(cin.get(ch)cout.put(ch);cin.clear();/用用cin讀讀取字符流,存入取字符流,存入buffer1,直到遇到空白字符,直到遇到空白字符為為止止cout nEnter a sentence:buffer1;coutn The string read with cin was:endlbuffer1endlendl;/用用帶帶3個參數(shù)的個參數(shù)的get函數(shù)從函數(shù)從輸輸入流中入流中讀讀取字符取字符cin.get(buffer2,SIZE);/此此處處未指明分隔符,使用默未指明分隔符,使用默認認的的n字符字符coutThe string read with cin.get was:endlbuffer2endl;return 0;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院3210.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.4 get成成員函數(shù)函數(shù) cin.eof()到達文件末尾(即到達文件末尾(即讀到文件到文件結束符)返回非束符)返回非0值,否否則返回返回0;cin.clear()在在讀入入輸入流入流時,讀到文件到文件結束符或束符或讀入非正常字入非正常字符(例如在整數(shù)符(例如在整數(shù)輸入入時遇到了非數(shù)字字符)遇到了非數(shù)字字符)時,輸入流入流標記置置為非非0(表示不正常),(表示不正常),clear()函數(shù)用于清除函數(shù)用于清除輸入流的入流的“不正常不正?!睒擞洝in 用用cin讀取字符流取字符流時,當遇到第一個空白符,當遇到第一個空白符時,認為輸入入結束,并束,并補上字符串上字符串結束符束符0。合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院3310.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.5 getline成成員函數(shù)函數(shù) inline istream&getline(char*,int,char=n);/從指定從指定輸入流中入流中讀int個字符,函數(shù)在個字符,函數(shù)在讀到比到比int少一個字符少一個字符或遇到字符或遇到字符char為止(止(char缺省缺省為n),并),并補上字符串上字符串結束符束符0。與。與帶3個參數(shù)個參數(shù)get成成員函數(shù)不同的是函數(shù)不同的是geline 要從要從輸入入流中流中刪除分隔符(即除分隔符(即讀取并取并刪除它),而并不是把它存放在除它),而并不是把它存放在buffer中。中。inline istream&getline(unsigned char*,int,char=n);inline istream&getline(signed char*,int,char=n);合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院3410.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.5 getline成成員函數(shù)函數(shù) /程序:程序:GETLINE.CPP/功能:演示功能:演示getline函數(shù)的用法函數(shù)的用法#include int main()const int SIZE=80;char bufferSIZE;cout Enter a sentence:buffer;coutn The string read with cin is:endlbufferendlendl;/用用getline函數(shù)函數(shù)讀入入19個字符,或遇個字符,或遇/終止止cin.getline(buffer,20,/);cout The second part is:n;coutbufferendlendl;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院3510.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.5 getline成成員函數(shù)函數(shù) /用用getline函數(shù)函數(shù)讀入入19個字符,或遇個字符,或遇n終止止cin.getline(buffer,20,n);cout The third part is:n;coutbufferendlendl;/用用get函數(shù)函數(shù)讀入入19個字符,或遇個字符,或遇/終止止cin.get(buffer,20,/);cout The forth part is:n;coutbufferendlendl;cout.put(char)cin.get();/此此時/還在在輸入流中,用入流中,用get()讀出并用出并用put輸出出coutendl;return 0;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院3610.4 常用成員函數(shù)輸入常用成員函數(shù)輸入/輸出輸出10.4.6 peek、putback、ignore成成員函數(shù)函數(shù) cin.peek()返回返回輸入流下一個字符,但并不將其從入流下一個字符,但并不將其從輸入流中入流中刪除。除。調(diào)用:用:ch=cin.peek();/ch是整型是整型變量量 cin.putpack(ch)將字符將字符變量量ch中字符放回中字符放回輸入流中。入流中。cin.ignore(n,ch)跳跳過輸入流中入流中n個字符,或遇到個字符,或遇到ch中指定的中指定的終止字符止字符時結束。束。n 缺省缺省為1,ch 缺省缺省為EOF。合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院3710.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作10.5.1 重重載流的插入運算符流的插入運算符 class COMPLEX private:public:friend ostream&operator (ostream&stream,COMPLEX&c);ostream&operator (ostream&stream,COMPLEX&c)stream(c.Real0)?+:)c.Imag(istream&stream,COMPLEX&c);istream&operator (istream&stream,COMPLEX&c)coutc.Real;coutc.Imag;return stream;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院3910.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作10.5.3 實例例#include#include math.h#include conio.hclass COMPLEX private:double Real;double Imag;public:COMPLEX();COMPLEX(const COMPLEX&c);COMPLEX(double r,double i=0);void operator=(COMPLEX&d);friend double abs(COMPLEX&c);合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4010.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作10.5.3 實例例 friend COMPLEX conj(COMPLEX&c);friend COMPLEX operator+(COMPLEX c1,COMPLEX c2);friend COMPLEX operator-(COMPLEX c1,COMPLEX c2);friend COMPLEX operator*(COMPLEX c1,COMPLEX c2);friend COMPLEX operator/(COMPLEX c1,COMPLEX c2);friend int operator=(COMPLEX&c1,COMPLEX&c2);friend int operator!=(COMPLEX&c1,COMPLEX&c2);friend ostream&operator (istream&stream,COMPLEX&c);合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4110.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作10.5.3 實例例 COMPLEX:COMPLEX()Real=0.0;Imag=0.0;COMPLEX:COMPLEX(const COMPLEX&c)Real=c.Real;Imag=c.Imag;COMPLEX:COMPLEX(double r,double i)Real=r;Imag=i;void COMPLEX:operator=(COMPLEX&d)Real=d.Real;Imag=d.Imag;double abs(COMPLEX&c)return sqrt(c.Real*c.Real+c.Imag*c.Imag);合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4210.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作10.5.3 實例例 COMPLEX conj(COMPLEX&c)COMPLEX temp;temp.Real=c.Real;temp.Imag=-c.Imag;return temp;COMPLEX operator+(COMPLEX c1,COMPLEX c2)COMPLEX temp;temp.Real=c1.Real+c2.Real;temp.Imag=c1.Imag+c2.Imag;return temp;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4310.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作10.5.3 實例例 COMPLEX operator-(COMPLEX c1,COMPLEX c2)COMPLEX temp;temp.Real=c1.Real-c2.Real;temp.Imag=c1.Imag-c2.Imag;return temp;COMPLEX operator*(COMPLEX c1,COMPLEX c2)COMPLEX temp;temp.Real=c1.Real*c2.Real-c1.Imag*c2.Imag;temp.Imag=c1.Real*c2.Imag+c1.Imag*c2.Real;return temp;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4410.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作10.5.3 實例例 int operator=(COMPLEX&c1,COMPLEX&c2)return(c1.Real=c2.Real)&(c1.Imag=c2.Imag);int operator!=(COMPLEX&c1,COMPLEX&c2)return(c1.Real!=c2.Real)|(c1.Imag!=c2.Imag);COMPLEX operator/(COMPLEX c1,COMPLEX c2)COMPLEX temp;double den;den=abs(c2)*abs(c2);temp.Real=(c1.Real*c2.Real+c1.Imag*c2.Imag)/den;temp.Imag=(c1.Imag*c2.Real-c1.Real*c2.Imag)/den;return temp;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4510.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作10.5.3 實例例 ostream&operator (ostream&stream,COMPLEX&c)stream(c.Real0)?+:)c.Imag(istream&stream,COMPLEX&c)coutc.Real;coutc.Imag;return stream;合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4610.5.3 實例例void main()COMPLEX a,b,c;double x=10.0;cout Input the first complex a:a;cout Input the second complex b:b;c=conj(a);couta c bendl;c=a+b;coutc ;c=a-b;coutc ;c=a*b;coutc ;c=a/b;coutcendl;c=a+x;coutc ;c=a-x;coutc ;c=a*x;coutc ;c=a/x;coutcendl;c=x+a;coutc ;c=x-a;coutc ;c=x*a;coutc ;c=x/a;coutcendl;cout(a=c)endl;cout(a!=c)endl;getch();10.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4710.5.4 設計自己的自己的輸入入/輸出操出操縱符符輸出操出操縱符定符定義形式:形式:ostream&操操縱符名字符名字(ostream&stream)自定自定義操操縱符代符代碼 return stream;兩種情況需兩種情況需設計操操縱符函數(shù)符函數(shù):n 為新新設備定定義操操縱符使得向新符使得向新設備輸出更方便;出更方便;n 需要重復使用的操作序列需要重復使用的操作序列組合定合定義在新操在新操縱符中。符中。操操縱符用于符用于輸出操作且不出操作且不帶參數(shù)參數(shù)時,即便空,即便空圓括號括號對也不能出也不能出現(xiàn)。10.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4810.5.4 設計自己的自己的輸入入/輸出操出操縱符符#include#include ostream&dollar_format(ostream&stream)/定制自己的定制自己的輸出操出操縱符符1stream.setf(ios:left);streamsetw(12)setprecision(2)setfill($);return stream;ostream&tab(ostream&stream)/定制自己的定制自己的輸出操出操縱符符2return streamt;int main()cout725.5endl;coutdollar_format725.5endl;coutatabbtabcendl;return 0;10.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院4910.5.4 設計自己的自己的輸入入/輸出操出操縱符符輸入操入操縱符定符定義形式:形式:istream&操操縱符名字符名字(istream&stream)自定自定義操操縱符代符代碼 return stream;#include istream&prompt(istream&stream)/定制自己的定制自己的輸入操入操縱符符couthex;return stream;int main()int input;cinpromptinput;coutinputendl;return 0;10.5 設計自己的輸入設計自己的輸入/輸出操作輸出操作合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院50流狀流狀態(tài)標志字志字enum io_state goodbit=0 x00,/不不設置任何位,一切正常置任何位,一切正常 eofbit=0 x01,/輸入流已入流已經(jīng)結束,無字符可束,無字符可讀入入 failbit=0 x02,/上次上次讀寫操作失寫操作失敗,但流仍可使用,但流仍可使用 badbit=0 x04,/試圖作無效的作無效的讀/寫操作,流不再可用寫操作,流不再可用 hardfail=0 x80 /不可恢復的不可恢復的嚴重重錯誤;ios類提供的提供的檢測或或設置流狀置流狀態(tài)的成的成員函數(shù):函數(shù):int rdstate();/返回流的當前狀返回流的當前狀態(tài)標識字字 int eof();/返回非返回非0值表示到達文件尾表示到達文件尾 int fail();/返回非返回非0值表示操作失表示操作失敗 int bad();/返回非返回非0值表示出表示出現(xiàn)錯誤 int good();/返回非返回非0值表示流操作正常表示流操作正常 int clear(int flag=0);/將流的狀將流的狀態(tài)設置置為flag10.6 檢測流操作的錯誤檢測流操作的錯誤合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院5110.7 文件流文件流讀寫寫文件的文件的過程:程:o往(文件)流往(文件)流中中插入一個字符;插入一個字符;o從(文件)流中提取一個字符;從(文件)流中提取一個字符;o打開文件并打開文件并獲得文件句柄(建立文件與流得文件句柄(建立文件與流連接)接)打開一個文件流打開一個文件流,以便用來,以便用來讀和寫。使用完后,需和寫。使用完后,需要要關關閉該文件流文件流。o#include ftream.h合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院5210.7.1 文件的打開與關文件的打開與關閉C+的三種文件流的三種文件流n輸入文件流:入文件流:類 ifstreamn輸出文件流:出文件流:類 ofstreamn輸入入/輸出文件流:出文件流:類 fstream 例:例:創(chuàng)建文件流建文件流對象象#include void main()/建立不同的文件流建立不同的文件流 ifstream in;/input file stream只能只能讀ofstream out;/output file stream只能寫只能寫fstream both;/I/O file stream10.7 文件流文件流合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院5310.7.1 文件的打開與關文件的打開與關閉1.使用函數(shù)使用函數(shù) open()打開文件打開文件open()的函數(shù)原型:的函數(shù)原型:void open(const char*filename,int mode,int prot=filebuf:openprot);nfilename:文件名字,可含路徑:文件名字,可含路徑nmode:文件的打開模式:文件的打開模式nprot:文件的:文件的訪問方式:方式:普通(普通(0)、只)、只讀(1)、)、隱藏藏(2)、系)、系統(tǒng)文件(文件(4)。)。一般使用缺省一般使用缺省值0。10.7 文件流文件流合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院5410.7.1 文件的打開與關文件的打開與關閉文件打開模式文件打開模式mode ios類中定中定義了一了一組枚枚舉常量描述常量描述這些模式:些模式:enum open_mode in =0 x01,/打開文件打開文件進行行讀操作操作 out =0 x02,/打開文件打開文件進行寫操作行寫操作 ate =0 x04,/打開打開時文件指文件指針定位到文件尾(定位到文件尾(at end)app =0 x08,/添加模式:所有增加都在文件尾部添加模式:所有增加都在文件尾部(append)trunc =0 x10,/如果文件已存在如果文件已存在則清空原文件清空原文件 nocreate =0 x20 /如果文件不存在如果文件不存在則打開失打開失敗 noreplace=0 x40,/如果文件存在如果文件存在則打開失打開失敗 binary =0 x80 /二二進制文件制文件 ;10.7 文件流文件流合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院5510.7.1 文件的打開與關文件的打開與關閉oifstream類中,中,open()的的mode參數(shù)缺省參數(shù)缺省值是是ios:inoofstream類中,中,open()的的mode參數(shù)缺省參數(shù)缺省值是是ios:outo缺省方式下,文件以文本方式打開缺省方式下,文件以文本方式打開omode參數(shù)用位或運算參數(shù)用位或運算|組合枚合枚舉常量常量ofstreamofile;ofile.open(“test.bak”,ios:out|ios:binary);/以二以二進制形式打開當前目制形式打開當前目錄下的下的test.bak文件,準文件,準備進行行寫操作寫操作 10.7 文件流文件流合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院5610.7.1 文件的打開與關文件的打開與關閉ofstreamofile;/創(chuàng)建一個建一個輸出文件流出文件流ofile.open(“text.txt”);/打開文本文件打開文本文件text.txt,使,使ofile流與流與該文文件相關件相關聯(lián)/寫文件寫文件text.txtofile.close();/關關閉text.txt文件文件ofile.open(“other.txt”);/使使ofile流與另一文件流與另一文件other.txt相關相關聯(lián):重用流重用流/寫文件寫文件other.txtofile.close();/關關閉other.txt文件文件10.7 文件流文件流合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院5710.7.1 文件的打開與關文件的打開與關閉2.通通過流流類的構造函數(shù)打開文件的構造函數(shù)打開文件在在創(chuàng)建流建流時調(diào)用構造函數(shù)直接與某文件相關用構造函數(shù)直接與某文件相關聯(lián)ofstream ofile(“text.txt”);/創(chuàng)建一個建一個輸出文件流出文件流ofile,打開文件,打開文件text.txt,使,使ofile流與流與該文文件相關件相關聯(lián)/寫文件寫文件text.txtofile.close();/關關閉text.txt文件文件流流類的構造函數(shù)的參數(shù)和缺省的構造函數(shù)的參數(shù)和缺省值與與openopen函數(shù)相同,用于在函數(shù)相同,用于在創(chuàng)建建一個流一個流時就使它與某個文件相關就使它與某個文件相關聯(lián)10.7 文件流文件流合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院5810.7.1 文件的打開與關文件的打開與關閉 打開文件失打開文件失敗,流狀,流狀態(tài)標識字中的字中的faibit、badbit或或hardbit將被置將被置為1,并且在,并且在ios類中重中重載的的“!”運算符返回非運算符返回非0值。異常模式異常模式處理方式:理方式:ifstream input_file(“D:VCmydata.txt”)if(!Input_file)警告打開文件失警告打開文件失敗;退出程序退出程序;繼續(xù)正常的文件操作正常的文件操作;10.7 文件流文件流合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院5910.7.2 文本文件的操作文本文件的操作例例1:把一個整數(shù)、一個浮點數(shù)和一個字符串寫到名:把一個整數(shù)、一個浮點數(shù)和一個字符串寫到名為out.txt的文的文本文件中本文件中#include int main()ofstream outfile;float f=123.23;int n=10;outfile.open(out.txt);if(!outfile)coutCannot open out.txt for output!n;return 1;/返回返回1表示打開文件不成功表示打開文件不成功outfile n f n;outfileThis is a text file;outfile.close();return 0;10.7 文件流文件流程序執(zhí)行后,在當前目錄下生程序執(zhí)行后,在當前目錄下生成文件成文件out.Txt,文件內(nèi)容如下:文件內(nèi)容如下:10 123.230003 This is a text file合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院6010.7.2 文本文件的操作文本文件的操作例例2:從例從例1程序建立的文件中程序建立的文件中讀入相關數(shù)據(jù)入相關數(shù)據(jù)#include#include int main()ifstream infile;infile.open(out.txt);if(!infile)cout n f ch str;cout n f ch n;cout str 運算符號跳過空白符號(如空運算符號跳過空白符號(如空格,回車),然后讀入對應于輸入對象類型的格,回車),然后讀入對應于輸入對象類型的字符字符合肥工業(yè)大學合肥工業(yè)大學 計算機與信息學院計算機與信息學院6110.7.2 文本文件的操作文本文件的操作例例3:文件拷:文件拷貝#include#include int CopyFile(char*file_from,char*file_to)/file_from:輸入文件名入文件名(源文件源文件);file_to:輸出文件名出文件名(目目標文件文件)char ch;/文件不存在文件不存在則打開失打開失敗ifstream from(file_from,ios:in|ios:nocreate);/以文本方式打開以文