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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

istream(控制臺輸入)

ostream(控制臺輸出)

ifstream(文件輸入)

istrstream(字符串變量輸入)

ofstream(文件輸出)

ostrstream(字符串變量輸出)

iostream(輸入/輸出)

fstream(文件輸入/輸出)

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

9面向對象的輸入/輸出在進行輸入/輸出時,首先創建一個I/O類的對象,然后,通過該對象(調用對象類的成員函數)進行輸入/輸出操作。istream類重載了操作符“>>”(抽取),用它可以進行基本類型數據的輸入操作。例如:istreamin(...);in>>x;//x是一個變量in>>y;//y是一個變量或in>>x>>y;ostream類重載了操作符“<<”(插入),用它可以進行基本數據類型數據的輸出操作。例如: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類的對象,它對應著計算機系統的標準輸入設備;cout屬于ostream類的對象,它對應著計算機系統的用于輸出程序正常運行結果的標準輸出設備;cerr和clog屬于ostream類的對象,它們對應著計算機系統的用于輸出程序錯誤信息的設備,通常情況下它們都對應著顯示器;在進行控制臺輸入/輸出時,程序中需要有下面的包含命令:

#include<iostream>12控制臺輸出任何基本數據類型的數據和指針都可以通過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)來實現。#include<iostream>#include<iomanip>//操縱符聲明的頭文件。usingnamespacestd;.....intx=10;cout<<hex<<x<<endl;//以十六進制輸出x的值,然后換行15控制臺輸出常用輸出操縱符操縱符含義endl輸出換行符,并執行flush操作flush使輸出緩存中的內容立即輸出dec十進制輸出oct八進制輸出hex十六進制輸出setprecision(intn)設置浮點數有效數字的個數或小數點后數字的位數setiosflags(longflags)/resetiosflags(longflags)設置/取消輸出格式,flags的取值可以是:ios::scientific(以指數形式顯示浮點數),ios::fixed(以小數形式顯示浮點數),等等16控制臺輸出對于浮點數(float、double和longdouble):當輸出格式為ios::scientific或ios::fixed時,操縱符setprecision用于設置浮點數(float和double)小數點后面的位數。當輸出格式為自動方式(既不為ios::scientific也不為ios::fixed,或兩者都有時),操縱符setprecision用于設置浮點數有效數字的個數,這時將根據要輸出的浮點數的實際有效數字自動選擇小數形式或指數形式,小數形式優先。初始狀態下,輸出格式為自動方式,輸出精度為6位有效數字。17控制臺輸出#include<iostream>#include<iomanip>usingnamespacestd;doubled=1234.56789;cout<<d<<endl//輸出:1234.57,6位有效數字

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論