第11章 輸入和輸出課件_第1頁
第11章 輸入和輸出課件_第2頁
第11章 輸入和輸出課件_第3頁
第11章 輸入和輸出課件_第4頁
第11章 輸入和輸出課件_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1第11章輸入和輸出華中科技大學機械科學與工程學院2本章內(nèi)容輸入/輸出(I/O)概述控制臺I/O文件I/O字符串I/O3輸入/輸出(I/O)概述4輸入/輸出(I/O)概述輸入/輸出(簡稱I/O)是程序的一個重要組成部分:程序運行所需要的數(shù)據(jù)往往要從外設(shè)(如:鍵盤、文件等)得到程序的運行結(jié)果通常也要輸出到外設(shè)(如:顯示器、打印機、文件等)中去在C++中,輸入/輸出不是語言定義的成分,而是由具體的實現(xiàn)(編譯程序)作為標準庫的功能來提供。5C++的I/O流在C++中,輸入/輸出操作是一種基于字節(jié)流的操作:在進行輸入操作時,可把輸入的數(shù)據(jù)看成逐個字節(jié)地從外設(shè)流入到計算機內(nèi)部(內(nèi)存);在進行輸出操作時,則把輸出的數(shù)據(jù)看成逐個字節(jié)地從內(nèi)存流出到外設(shè)。在C++的標準庫中,除了提供基于字節(jié)的輸入/輸出操作外,為了方便使用,還提供了基于C++基本數(shù)據(jù)類型數(shù)據(jù)的輸入/輸出操作。在C++程序中也可以對類庫中輸入/輸出類的一些操作進行重載,使其能對自定義類的對象進行輸入/輸出操作。6I/O的分類基于控制臺的I/O:從標準輸入設(shè)備(如:鍵盤)獲得數(shù)據(jù)把程序結(jié)果從標準輸出設(shè)備(如:顯示器)輸出基于文件的I/O:從外存文件獲得數(shù)據(jù)把程序結(jié)果保存到外存文件中基于字符串變量的I/O:從程序中的字符串變量中獲得數(shù)據(jù)把程序結(jié)果保存到字符串變量中7C++輸入輸出的實現(xiàn)途徑過程式通過從C語言保留下來的函數(shù)庫中的輸入/輸出函數(shù)來實現(xiàn)。面向?qū)ο笸ㄟ^C++的I/O類庫中的I/O類庫來實現(xiàn)。8面向?qū)ο蟮妮斎?輸出C++的I/O類庫提供了以面向?qū)ο蠓绞竭M行輸入/輸出。以下是I/O類庫中基本的I/O類:ios

istream(控制臺輸入)

ostream(控制臺輸出)

ifstream(文件輸入)

istrstream(字符串變量輸入)

ofstream(文件輸出)

ostrstream(字符串變量輸出)

iostream(輸入/輸出)

fstream(文件輸入/輸出)

strstream(字符串變量輸入/輸出)

9面向?qū)ο蟮妮斎?輸出在進行輸入/輸出時,首先創(chuàng)建一個I/O類的對象,然后,通過該對象(調(diào)用對象類的成員函數(shù))進行輸入/輸出操作。istream類重載了操作符“>>”(抽?。盟梢赃M行基本類型數(shù)據(jù)的輸入操作。例如:istreamin(...);in>>x;//x是一個變量in>>y;//y是一個變量或in>>x>>y;ostream類重載了操作符“<<”(插入),用它可以進行基本數(shù)據(jù)類型數(shù)據(jù)的輸出操作。例如:ostreamout(...);out<<e1;//e1是一個表達式out<<e2;//e2是一個表達式或out<<e1<<e2;10控制臺I/O11控制臺I/O在I/O類庫中預定義了四個I/O對象:cin、cout、cerr以及clog,可直接利用這些對象進行控制臺的輸入/輸出操作:cin屬于istream類的對象,它對應著計算機系統(tǒng)的標準輸入設(shè)備;cout屬于ostream類的對象,它對應著計算機系統(tǒng)的用于輸出程序正常運行結(jié)果的標準輸出設(shè)備;cerr和clog屬于ostream類的對象,它們對應著計算機系統(tǒng)的用于輸出程序錯誤信息的設(shè)備,通常情況下它們都對應著顯示器;在進行控制臺輸入/輸出時,程序中需要有下面的包含命令:

#include<iostream>12控制臺輸出任何基本數(shù)據(jù)類型的數(shù)據(jù)和指針都可以通過cout、cerr、clog對象和插入操作符“<<”進行輸出。#include<iostream>usingnamespacestd;//......intx=1;floatf=2.0;charch[]="abcd";int*p=&x;//......cout<<x<<endl;//輸出x的值cout<<f<<endl;//輸出f的值cout<<ch<<endl;//輸出ch的值cout<<"hello"<<endl;//輸出字符串"hello"cout<<p<<endl;//輸出變量p的值,即變量x的地址//或cout<<x<<f<<ch<<"hello"<<p;13控制臺輸出constchar*p="abcd";cout<<p<<endl;//輸出字符串“abcd”而不是字符串“abcd”的首地址cout<<(void*)p<<endl;//輸出字符串“abcd”的首地址,及變量p的值輸出指向字符串的指針時,并不輸出字符串的首地址,而是輸出字符串14控制臺輸出格式控制為了對輸出格式進行進一步的控制,可以通過輸出一些操縱符(manipulator)來實現(xiàn)。#include<iostream>#include<iomanip>//操縱符聲明的頭文件。usingnamespacestd;.....intx=10;cout<<hex<<x<<endl;//以十六進制輸出x的值,然后換行15控制臺輸出常用輸出操縱符操縱符含義endl輸出換行符,并執(zhí)行flush操作flush使輸出緩存中的內(nèi)容立即輸出dec十進制輸出oct八進制輸出hex十六進制輸出setprecision(intn)設(shè)置浮點數(shù)有效數(shù)字的個數(shù)或小數(shù)點后數(shù)字的位數(shù)setiosflags(longflags)/resetiosflags(longflags)設(shè)置/取消輸出格式,flags的取值可以是:ios::scientific(以指數(shù)形式顯示浮點數(shù)),ios::fixed(以小數(shù)形式顯示浮點數(shù)),等等16控制臺輸出對于浮點數(shù)(float、double和longdouble):當輸出格式為ios::scientific或ios::fixed時,操縱符setprecision用于設(shè)置浮點數(shù)(float和double)小數(shù)點后面的位數(shù)。當輸出格式為自動方式(既不為ios::scientific也不為ios::fixed,或兩者都有時),操縱符setprecision用于設(shè)置浮點數(shù)有效數(shù)字的個數(shù),這時將根據(jù)要輸出的浮點數(shù)的實際有效數(shù)字自動選擇小數(shù)形式或指數(shù)形式,小數(shù)形式優(yōu)先。初始狀態(tài)下,輸出格式為自動方式,輸出精度為6位有效數(shù)字。17控制臺輸出#include<iostream>#include<iomanip>usingnamespacestd;doubled=1234.56789;cout<<d<<endl//輸出:1234.57,6位有效數(shù)字

<<setprecision(3)<<d<<endl//輸出:1.23e+003,3位有效數(shù)字

<<setprecision(7)<<d<<endl//輸出:1234.568,7位有效數(shù)字

<<setiosflags(ios::scientific)//設(shè)置ios::scientific輸出格式

<<d<<endl//輸出:1.2345679e+003,小數(shù)點后面7位有效數(shù)字

<<resetiosflags(ios::scientific)//取消ios::scientific輸出格式

<<setiosflags(ios::fixed)//設(shè)置ios::fixed輸出格式

<<d<<endl;//輸出:1234.5678900,小數(shù)點后面7位有效數(shù)字18/a:蜂鳴,響鈴/b:回退:向后退一格/f:換頁/n:換行,光標到下行行首/r:回車,光標到本行行首/t:水平制表/v:垂直制表//:反斜杠/':單引號/":雙引號/?:問號/ddd:三位八進制/xhh:二位十六進制/0:空字符(NULL),什么都不做19控制臺輸出除了通過插入操作符進行輸出外,也可以用ostream類提供的一些基于字節(jié)流的操作來進行輸出。//輸出一個字符。ostream&ostream::put(charch);//輸出p所指向的內(nèi)存空間中count個字節(jié)。ostream&ostream::write(constchar*p,intcount);20控制臺輸入任何基本數(shù)據(jù)類型的數(shù)據(jù)都可以通過cin對象和抽取操作符“>>”進行輸入。在輸入時,各個數(shù)據(jù)之間用空白符分開,最后輸入一個回車符。#include<iostream>usingnamespacestd;......intx;doubley;charstr[10];cin>>x;cin>>y;cin>>str;//或者cin>>x>>y>>str;21控制臺輸入可以通過一些操縱符來控制輸入的行為cin>>setw(10)>>str;//把輸入的前9個字符和一個'\0'放入str中。除了抽取操作符“>>”外,還可以使用istream類的基于字節(jié)流的成員函數(shù)來進行輸入//輸入一個字符。istream::get(char&ch);//輸入一個字符串直到輸入了count-1個字符或遇到//delim指定的字符為止,并自動加上一個'\0'字符。istream::getline(char*p,intcount,chardelim=‘\n’);//讀入count個字符至p所指向的內(nèi)存空間中。istream::read(char*p,intcount);22輸入/輸出操作符“>>”和“<<”的重載為了能用抽取操作符“>>”和插入操作符“<<”對自定義類的對象進行輸入/輸出操作,就需要針對自定義的類重載插入操作符“<<”和抽取操作符“>>”。對自定義的類重載插入操作符“<<”和抽取操作符“>>”時,須作為全局函數(shù)來重載。23插入操作符“<<”的重載classA{ intx,y;public: ......

friendostream&operator<<(ostream&out,constA&a);};ostream&operator<<(ostream&out,constA&a){ out<<a.x<<','<<a.y; returnout;}.....Aa,b;cout<<a<<endl<<b;24派生類輸出操作符“<<”的重載classA{ intx,y;public: ......

virtualvoiddisplay(ostream&out)const {out<<x<<','<<y;}};classB:publicA{ doublez;public: ...... voiddisplay(ostream&out)const { A::display(out); out<<','<<z; }};ostream&operator<<(ostream&out,constA&a){ a.display(out);//動態(tài)綁定到A類或B類對象的display。

returnout;}25文件I/O26文件I/O程序運行結(jié)果有時需要永久性地保存起來,以供其它程序或本程序下一次運行時使用。程序運行所需要的數(shù)據(jù)也常常要從其它程序或本程序上一次運行所保存的數(shù)據(jù)中獲得。用于永久性保存數(shù)據(jù)的設(shè)備稱為外部存儲器(簡稱:外存),如:磁盤、磁帶、光盤等。在外存中保存數(shù)據(jù)的方式通常有兩種:文件和數(shù)據(jù)庫。本課程只介紹以文件方式來永久性地保存數(shù)據(jù)。27文件的基本概念在C++中,把文件看成是由一系列字節(jié)所構(gòu)成的字節(jié)串,稱為流式文件,對文件中數(shù)據(jù)的操作(輸入/輸出)通常是逐個字節(jié)順序進行。在對文件數(shù)據(jù)進行讀寫的過程:打開文件。目的是:在程序內(nèi)部的一個表示文件的變量/對象與外部的一個具體文件之間建立聯(lián)系。文件讀/寫關(guān)閉文件。目的是把暫存在內(nèi)存緩沖區(qū)中的內(nèi)容寫入到文件中,并歸還打開文件時申請的內(nèi)存資源。28文件的基本概念每個打開的文件都有一個內(nèi)部的位置指針,它指出文件的當前讀寫位置。進行讀/寫操作時,每讀入/寫出一個字節(jié),文件位置指針會自動往后移動一個字節(jié)的位置。位置指針29文件數(shù)據(jù)的存儲方式文本方式(text)只包含可顯示字符和有限的幾個控制字符(如:‘\r’、‘\n’、‘\t’等);一般用于存儲具有“行”結(jié)構(gòu)的文本數(shù)據(jù);文本方式存儲整數(shù)1234567:依次把1、2、3、4、5、6、7的ASCII碼(共7個字節(jié))寫入文件。二進制方式(binary)可以包含任意的二進制字節(jié);一般用于存儲無顯式結(jié)構(gòu)的數(shù)據(jù);二進制方式存儲整數(shù)1234567把整數(shù)1234567的計算機內(nèi)部表示(假設(shè)為32位計算機):0012D687(十六進制,4個字節(jié):0012D687)寫入文件。30文件輸出

在利用I/O類庫中的類進行外部文件的輸入/輸出時,程序中需要下面的包含命令:#include<iostream>#include<fstream>

對于文件輸出:創(chuàng)建一個ofstream類(是ostream類的派生類)的對象。建立ofstream類的對象與外部文件之間的聯(lián)系。直接方式間接方式31建立ofstream類的對象與外部文件聯(lián)系的方式直接方式在創(chuàng)建ofstream類的對象時指出外部文件名和打開方式。ofstreamout_file(<文件名>,<打開方式>);間接方式在創(chuàng)建了ofstream類的對象之后,調(diào)用ofstream的一個成員函數(shù)open來指出與外部文件的聯(lián)系。ofstreamout_file;out_file.open(<文件名>,<打開方式>);32文件輸出打開方式打開方式:ios::out,含義是打開一個外部文件用于寫操作,如果外部文件已存在,則首先把它的內(nèi)容清除;否則,先創(chuàng)建該外部文件。ios::app,含義是打開一個外部文件用于添加(從文件末尾)操作。如果外部文件不存在,則先創(chuàng)建該外部文件。上面的值與ios::binary按位或(|)操作的結(jié)果,它表示按二進制方式打開文件。默認的打開方式是文本方式。對以文本方式打開的文件,當輸出的字符為'\n'時,在某些平臺上(如:DOS和Windows平臺)將自動轉(zhuǎn)換成'\r'和'\n'兩個字符寫入外部文件。33文件輸出打開方式打開文件時,必須要對文件打開操作的成功與否進行判斷。判斷文件是否成功打開可以采用以下方式if(!out_file)//或:out_file.fail()//或:!out_file.is_open(){......//失敗處理}34文件輸出文件成功打開后,可以使用插入操作符“<<”或ofstream類的一些成員函數(shù)來進行文件輸出操作,例如:

ofstreamout_file("d:\\myfile.dat",ios::out);if(!out_file)exit(-1);intx=1;doubley=2.0;......out_file<<x<<','<<y<<endl;out_file.put('A');//將一個字符寫入文件out_file.write("ABCDEFG",7);out_file.close();文件輸出結(jié)束時,要使用ofstream的一個成員函數(shù)close關(guān)閉文件:out_file.close();35文件輸入首先創(chuàng)建一個ifstream類(istream類的派生類)的對象,并與外部文件建立聯(lián)系。例如:ifstreamin_file(<文件名>,<打開方式>);或ifstreamin_file;in_file.open(<文件名>,<打開方式>);打開方式:ios::in,它的含義與fopen的打開方式“r”相同也可以把它與ios::binary通過按位或(|)操作實現(xiàn)二進制打開方式。默認為文本方式。對以文本方式打開的文件,當文件中的字符為連續(xù)的'\r'和'\n'時,在某些平臺上(如:DOS和Windows平臺)將自動轉(zhuǎn)換成一個字符'\n'輸入。36文件輸入判斷打開成功的方式與輸出文件對象相同。文件成功打開后,可以使用抽取操作符“>>”或ifstream類的一些成員函數(shù)來進行文件輸出操作。ifstreamin_file("d:\\myfile.dat",ios::in);if(!in_file) exit(-1);charch,buf[11];intx;doubley;......in_file>>x>>ch>>y;in_file.get(ch);//從流中讀取一個字符,結(jié)果保存在引用ch中in_file.read(buf,7);//從文件中讀取7個字符到buf指向的緩存中buf[7]='\0';in_file.close();37文件輸入判斷文件是否結(jié)束可以調(diào)用ios類的成員函數(shù)eof來實現(xiàn):intios::eof();該函數(shù)返回0表示文件未結(jié)束;返回非0表示文件結(jié)束。文件輸出操作結(jié)束時,要使用ifstream的一個成員函數(shù)close關(guān)閉文件:in_file.close();注意:從文件輸入必須要知道文件中數(shù)據(jù)的存儲格式!38文件輸入/輸出如果需要打開一個既能讀入數(shù)據(jù)、也能輸出數(shù)據(jù)的文件,則需要創(chuàng)建一個fstream類的對象(類fstream是類iostream的派生類)。在創(chuàng)建fstream類的對象并建立與外部文件的聯(lián)系時,文件打開方式應為:ios::in|ios::out(可在文件任意位置寫)或ios::in|ios::app(只能在文件末尾寫)39隨機存取文件為了能夠隨機讀寫文件中的數(shù)據(jù),必須要顯示地指出讀寫的位置。對以輸入方式打開的文件,

溫馨提示

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

評論

0/150

提交評論