C++大學基礎教程第十二章_第1頁
C++大學基礎教程第十二章_第2頁
C++大學基礎教程第十二章_第3頁
C++大學基礎教程第十二章_第4頁
C++大學基礎教程第十二章_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2022-3-27北京郵電大學電信工程學院計算機技術中心1C+大學基礎教程大學基礎教程第第1212章章 I/OI/O流及輸入輸出流及輸入輸出 北京郵電大學電信工程學院北京郵電大學電信工程學院 計算機技術中心計算機技術中心2022-3-27北京郵電大學電信工程學院計算機技術中心-2-C+語言沒有輸入/輸出語句,但C+編譯系統(tǒng)帶有一個面向對象的輸入/輸出軟件包,它就是I/O流類庫。軟件包有時稱為庫文件(.lib文件),類庫是指用面向對象方法實現(xiàn)的軟件包。 12.1 12.1 流類庫概述流類庫概述12.2 12.2 輸出流輸出流12.3 12.3 輸入流輸入流 12.4 12.4 輸入輸入/ /輸出

2、流輸出流 12.5 12.5 重載插入和提取運算符重載插入和提取運算符第第1212章章 I/OI/O流及輸入輸出流及輸入輸出2022-3-27北京郵電大學電信工程學院計算機技術中心-4-C C語言中讀寫文件語言中讀寫文件步驟步驟: :n打開文件打開文件n讀讀/ /寫文件寫文件n關閉文件關閉文件例例: : 寫文件寫文件#include struct Date int month, date, year; ;void main() const N=30;short k;struct Date dtN;FILE *pf;fopen(f:date.dat,”wb”);for(k=0; kN; k+)

3、dtk.year=2006;dtk.month=4;dtk.date=k+1;fwrite(dt,sizeof(Date), N,pf);fclose();2022-3-27北京郵電大學電信工程學院計算機技術中心-5-C C語言中讀寫文件語言中讀寫文件步驟步驟: :n打開文件打開文件n讀讀/ /寫文件寫文件n關閉文件關閉文件例例: : 讀文件讀文件#include struct Date int month, date, year; ;void main() const N=30;short k;struct Date dtN;FILE *pf;fopen(f:date.dat,”rb”);

4、fread(dt,sizeof(Date), N,pf);for(k=0; kN; k+) coutdtk.yeardtk.monthdtk.date插入運算符:插入運算符:12.1 12.1 流類庫概述流類庫概述 2022-3-27北京郵電大學電信工程學院計算機技術中心13 12.2 12.2 輸出流輸出流2022-3-27北京郵電大學電信工程學院計算機技術中心-14-系統(tǒng)已經(jīng)定義了標準設備輸出流類,并且已經(jīng)定義系統(tǒng)已經(jīng)定義了標準設備輸出流類,并且已經(jīng)定義了該類的對象:了該類的對象:ncout cout 標準輸出,緩沖區(qū)滿時被輸出。標準輸出,緩沖區(qū)滿時被輸出。ncerr cerr 標準錯誤輸

5、出,沒有緩沖,發(fā)送給它的內(nèi)容立即標準錯誤輸出,沒有緩沖,發(fā)送給它的內(nèi)容立即被輸出。被輸出。nclog clog 類似于類似于cerrcerr,但是有緩沖,緩沖區(qū)滿時被輸出。但是有緩沖,緩沖區(qū)滿時被輸出。 程序中只需程序中只需# #include include ,可以直接使用可以直接使用這些對象,從鍵盤輸入,向顯示器輸出。這些對象,從鍵盤輸入,向顯示器輸出。 12.2.1 12.2.1 設備輸出流設備輸出流 2022-3-27北京郵電大學電信工程學院計算機技術中心-15-標準輸出設備一般指顯示器,但可以在操作系統(tǒng)標準輸出設備一般指顯示器,但可以在操作系統(tǒng)下修改為別的設備,比如,重定向為磁盤文件

6、。下修改為別的設備,比如,重定向為磁盤文件。流流cerrcerr和和clogclog把信息輸出到默認錯誤日志上,該把信息輸出到默認錯誤日志上,該日志通常是指顯示器,不能重定向。日志通常是指顯示器,不能重定向。 12.2.1 12.2.1 設備輸出流設備輸出流 2022-3-27北京郵電大學電信工程學院計算機技術中心-16-例例12.112.1:將:將4 4個浮點數(shù)輸出到屏幕顯示,每行輸出一個浮點數(shù)輸出到屏幕顯示,每行輸出一個數(shù),靠右對齊,占個數(shù),靠右對齊,占1010個字符的寬度,不足個字符的寬度,不足1010個字個字符在數(shù)的前面用符在數(shù)的前面用“* *”號填充。號填充。 /例例12.112.1

7、:使用成員函數(shù)控制輸出格式:使用成員函數(shù)控制輸出格式#include using namespace std;void main() double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cout.width(10); cout.fill(*); cout valuesi n; 使用使用widthwidth函數(shù)控制輸出寬函數(shù)控制輸出寬度為度為1010個字符,默認的個字符,默認的按右對齊,不足按右對齊,不足1010個字個字符的前邊加空格,如果符的前邊加空格,如果不想使用默認的空格填不想使用默認的空格填充符,可以調(diào)用充符,可以調(diào)用

8、fillfill函數(shù)函數(shù)設置填充字符的值。設置填充字符的值。 2022-3-27北京郵電大學電信工程學院計算機技術中心-17-可以使用操縱符或調(diào)用成員函數(shù)進行輸出格式控制可以使用操縱符或調(diào)用成員函數(shù)進行輸出格式控制,可以根據(jù)需要靈活選用??梢愿鶕?jù)需要靈活選用。 操縱符是在標準頭文件操縱符是在標準頭文件iomanipiomanip中定義的。中定義的。 12.2.1 12.2.1 設備輸出流設備輸出流 操縱符操縱符成員函數(shù)成員函數(shù)功能描述功能描述decflags(10)按按1010進制輸出進制輸出hexflag(16)按按1616進制輸出進制輸出octflag(8)按按8 8進制輸出進制輸出set

9、fill(c)fill(c)設置填充字符為設置填充字符為c csetprecision(n)precision(n)顯示小數(shù)精度為顯示小數(shù)精度為n n位位width(n)設置輸出寬度為設置輸出寬度為n n個字符個字符setw(n)只有只有setw()setw()不是持續(xù)性的,使用一次,只負責設置一次不是持續(xù)性的,使用一次,只負責設置一次輸出的寬度,其它操縱符都是持續(xù)性的。輸出的寬度,其它操縱符都是持續(xù)性的。 2022-3-27北京郵電大學電信工程學院計算機技術中心-18-操縱符操縱符成員函數(shù)成員函數(shù)功能描述功能描述fixedflags(ios:fixed)按十進制表示法顯示浮點數(shù)按十進制表示法

10、顯示浮點數(shù)scientificflags(ios:scientific)按科學記數(shù)法顯示浮點數(shù)按科學記數(shù)法顯示浮點數(shù)leftflags(ios:left)左對齊左對齊rightflags(ios:right)右對齊右對齊uppercaseflags(ios:uppercase)16進制數(shù)大寫輸出進制數(shù)大寫輸出lowercaseflags(ios:lowercase)16進制數(shù)小寫輸出進制數(shù)小寫輸出showpointflags(ios:showpoint)總是顯示小數(shù)點總是顯示小數(shù)點noshowpointflags(ios:noshowpoint)僅當小數(shù)部分不為僅當小數(shù)部分不為0時才顯示小數(shù)點

11、時才顯示小數(shù)點boolalphaflags(ios:boolalphi)用符號用符號true和和false顯示邏輯值顯示邏輯值noboolalphaflags(ios:noboolalphi)用用1和和0顯示邏輯值顯示邏輯值showposflags(ios:showpos)顯示正數(shù)前有顯示正數(shù)前有“+”號號noshowposflags(ios:noshowpos)顯示正數(shù)前沒有顯示正數(shù)前沒有“+”號號2022-3-27北京郵電大學電信工程學院計算機技術中心-19-例例12.212.2:輸出:輸出8 8進制和進制和1616進制數(shù)進制數(shù) #include #include using namesp

12、ace std;void main() int num=1000;cout.flags(ios:uppercase);coutDecimal:decnumendl;coutHexadecimal:hexnumendl;coutOctal:octnumendl;把正數(shù)把正數(shù)10001000按按8 8進制、進制、1616進制等輸出進制等輸出到屏幕顯示,使用操縱符進行控到屏幕顯示,使用操縱符進行控制。制。1616進制顯示時,如果遇到進制顯示時,如果遇到A-FA-F,要求用大寫,調(diào)用成員函數(shù)進行要求用大寫,調(diào)用成員函數(shù)進行控制??刂?。2022-3-27北京郵電大學電信工程學院計算機技術中心-20-例例

13、12.412.4:使用操縱符:使用操縱符showpointshowpoint控制浮點數(shù)顯示出小數(shù)點;使用控制浮點數(shù)顯示出小數(shù)點;使用showposshowpos控制正數(shù)顯示出控制正數(shù)顯示出“+”“+”號,默認的是不顯示。號,默認的是不顯示。 /例例12.4:強制顯示小數(shù)點和符號:強制顯示小數(shù)點和符號#include #include using namespace std;void main() cout10.0/5endl;coutshowpoint10.0/5endl;cout10 -20endl;coutshowpos10 -20open(“filename.dat”, iosmode)

14、; 12.2.2 12.2.2 文件輸出流文件輸出流 2022-3-27北京郵電大學電信工程學院計算機技術中心-23-Ofstream類構造函數(shù)原型類構造函數(shù)原型ofstream();ofstream( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot );ofstream:openvoid open( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot );文件名文件名共享方式,一般共享方式,一般用缺省值。用缺省值。

15、文件打開方式,表文件打開方式,表12-3ios:in,ios:out,ios:nocreate,ios:binary2022-3-27北京郵電大學電信工程學院計算機技術中心-24-例例12.512.5:把學生信息保存到磁盤文件。學生的信息包括:把學生信息保存到磁盤文件。學生的信息包括:學號、姓名、年齡等,是一個結構類型學號、姓名、年齡等,是一個結構類型studentstudent,結構結構變量在定義時就初始化。變量在定義時就初始化。#include #include using namespace std;struct student long num; char name20; char s

16、ex; int age; s t u = 2 0 0 4 111 8 , L i Li,F,18;void main() ofstream ofile(student.txt); ofilesetw(8)stu.num setw(20) setw(3)stu.sex setw(3)stu.ageendl;2022-3-27北京郵電大學電信工程學院計算機技術中心-25-在輸出到文件時,同樣可以使用操縱符,在輸出到文件時,同樣可以使用操縱符,或使用與操縱符等價的成員函數(shù)進行格或使用與操縱符等價的成員函數(shù)進行格式控制。式控制。 12.2.2 12.2.2 文件輸出流文件輸出流 202

17、2-3-27北京郵電大學電信工程學院計算機技術中心-26-文件輸出流常用的一些其它的成員函數(shù)文件輸出流常用的一些其它的成員函數(shù):openopen函數(shù):打開文件函數(shù):打開文件putput函數(shù):把一個字符寫到輸出流中函數(shù):把一個字符寫到輸出流中. 例例:cout.put(c);writewrite函數(shù):把內(nèi)存中的一塊內(nèi)容寫到一個輸出文件函數(shù):把內(nèi)存中的一塊內(nèi)容寫到一個輸出文件流中流中.n把內(nèi)存中的一塊內(nèi)容寫到一個輸出文件流中,該函數(shù)帶兩把內(nèi)存中的一塊內(nèi)容寫到一個輸出文件流中,該函數(shù)帶兩個參數(shù):一個個參數(shù):一個charchar指針(指向內(nèi)存數(shù)據(jù)的起始地址)和一指針(指向內(nèi)存數(shù)據(jù)的起始地址)和一個所寫

18、的字節(jié)數(shù)。常用于二進制文件的輸出。個所寫的字節(jié)數(shù)。常用于二進制文件的輸出。 closeclose函數(shù):關閉文件函數(shù):關閉文件 12.2.2 12.2.2 文件輸出流文件輸出流 2022-3-27北京郵電大學電信工程學院計算機技術中心-27-例例12.712.7:把數(shù)組中:把數(shù)組中1010個整數(shù)保存到磁盤文件中。個整數(shù)保存到磁盤文件中。其中包含整數(shù)其中包含整數(shù)1010。 /二進制輸出文件二進制輸出文件#include using namespace std;void main() short a10=82, 36, 25, 79, 44, 10, 51, 90, 63, 28; ofstream

19、 ofile(“f:temptest.dat”, ios:binary); ofile.write(char*)a, 20); ofile.close;2022-3-27北京郵電大學電信工程學院計算機技術中心28 12.3 12.3 輸入流輸入流 2022-3-27北京郵電大學電信工程學院計算機技術中心-29-系統(tǒng)已經(jīng)預先定義了標準設備輸入流,并且已經(jīng)定系統(tǒng)已經(jīng)預先定義了標準設備輸入流,并且已經(jīng)定義了該類的對象義了該類的對象cincin。一般不需要構造新的設備輸。一般不需要構造新的設備輸入流對象,只使用預先定義的入流對象,只使用預先定義的cincin對象。對象。 從輸入流提取時,也可以使用的操

20、縱符進行輸入格從輸入流提取時,也可以使用的操縱符進行輸入格式的控制。式的控制。 從輸入流提取時,也可以使用流類定義的函數(shù)進行從輸入流提取時,也可以使用流類定義的函數(shù)進行輸入操作。輸入操作。 12.3.1 12.3.1 標準設備輸入流標準設備輸入流 2022-3-27北京郵電大學電信工程學院計算機技術中心-30-從輸入流提取時,也可以使用流類定義的函數(shù)進行輸從輸入流提取時,也可以使用流類定義的函數(shù)進行輸入操作。常用的函數(shù)有:入操作。常用的函數(shù)有: getget函數(shù)函數(shù): : 非格式化非格式化getget函數(shù)的功能與提取運算符(函數(shù)的功能與提取運算符()很相)很相象,主要的不同點是象,主要的不同點

21、是getget函數(shù)在讀取數(shù)據(jù)時包括空函數(shù)在讀取數(shù)據(jù)時包括空格字符,而提取運算符在默認情況下以空格字符格字符,而提取運算符在默認情況下以空格字符作為分隔符,無法讀取。作為分隔符,無法讀取。 2022-3-27北京郵電大學電信工程學院計算機技術中心-31-#include using namespace std;void main() char letter; while(!cin.eof() letter =cin.get(); letter =toupper(letter); if(letter=Y) cout Y be met.; break; cout letter; 例例12.812.8

22、:用:用getget函數(shù)循環(huán)讀取字符,轉換成大寫輸函數(shù)循環(huán)讀取字符,轉換成大寫輸出,直到用戶鍵入出,直到用戶鍵入YY時結束。時結束。 2022-3-27北京郵電大學電信工程學院計算機技術中心-32-getline函數(shù)函數(shù) 非格式化非格式化getlinegetline成員函數(shù)的功能是允許從輸入成員函數(shù)的功能是允許從輸入流中讀取多個字符,并且允許指定輸入終止字符流中讀取多個字符,并且允許指定輸入終止字符(默認值是換行符)。在讀取完成后,從讀取的(默認值是換行符)。在讀取完成后,從讀取的內(nèi)容中刪除該終止字符??梢宰x取一個包含空格內(nèi)容中刪除該終止字符??梢宰x取一個包含空格的文本塊,然后再進行分析。的文

23、本塊,然后再進行分析。 2022-3-27北京郵電大學電信工程學院計算機技術中心-33-例例12.912.9:使用:使用getlinegetline從鍵盤輸入中讀取,直到遇到從鍵盤輸入中讀取,直到遇到$字符?;蛘咦疃嘧x取字符。或者最多讀取8080個字符,然后把讀個字符,然后把讀取的信息再輸出到屏幕顯示出來。取的信息再輸出到屏幕顯示出來。 /例例12.9:使用輸入流的成員函數(shù):使用輸入流的成員函數(shù)getline()()#include using namespace std;void main() char line80;coutInput a string terminated by $end

24、l;cin.getline(line,80,$);coutlineendl;2022-3-27北京郵電大學電信工程學院計算機技術中心-34-文件輸入流類文件輸入流類ifstreamifstream,支持從磁盤文件讀取。,支持從磁盤文件讀取。如果需要一個僅用于讀取的磁盤文件,可以構如果需要一個僅用于讀取的磁盤文件,可以構造一個造一個ifstreamifstream類的對象,并且可以指定使用類的對象,并且可以指定使用二進制或文本模式。二進制或文本模式??梢栽诙x流對象的同時,指定相關聯(lián)的文件,可以在定義流對象的同時,指定相關聯(lián)的文件,在構造該對象時自動打開文件;也可以先定義在構造該對象時自動打開文

25、件;也可以先定義流對象,隨后調(diào)用流對象,隨后調(diào)用openopen成員函數(shù),指定相關聯(lián)成員函數(shù),指定相關聯(lián)的文件并打開。的文件并打開。 12.3.2 12.3.2 文件輸入流文件輸入流 2022-3-27北京郵電大學電信工程學院計算機技術中心-35-很多格式化選項和成員函數(shù)都可以應用于很多格式化選項和成員函數(shù)都可以應用于ifstreamifstream類對象類對象 nreadread函數(shù)函數(shù) read read成員函數(shù)從一個文件把字節(jié)流讀到一個指定的成員函數(shù)從一個文件把字節(jié)流讀到一個指定的存儲區(qū),由長度參數(shù)確定要讀的字節(jié)數(shù)。當讀了指存儲區(qū),由長度參數(shù)確定要讀的字節(jié)數(shù)。當讀了指定的字節(jié)數(shù)或遇到文件

26、結束符時讀結束。定的字節(jié)數(shù)或遇到文件結束符時讀結束。 12.3.2 12.3.2 文件輸入流文件輸入流 2022-3-27北京郵電大學電信工程學院計算機技術中心-36-#include #include #include using namespace std;void main()coutFile of values to be averaged: ;char *FileName=“f:temptest.dat”;ifstream file(FileName,ios:binary);if (! file)cerrCannot open FileName for averaging.endl;

27、exit(1);例例12.1312.13:設計一個通用目的的平均值計算器,參加平均計算的:設計一個通用目的的平均值計算器,參加平均計算的數(shù)都存在一個文件中。運行計算器程序時,把該文件的文件名數(shù)都存在一個文件中。運行計算器程序時,把該文件的文件名從鍵盤讀進來,打開文件,讀取其中的數(shù)據(jù)進行平均計算,把從鍵盤讀進來,打開文件,讀取其中的數(shù)據(jù)進行平均計算,把計算結果輸出到屏幕顯示。計算結果輸出到屏幕顯示。 2022-3-27北京郵電大學電信工程學院計算機技術中心-37- int a20, Numbers (20);float Sum = 0;file.read(char*)a,Numbers); fo

28、r(int i=0;i 0)float Average = Sum/Numbers;coutAverage of values from FileName is Averageendl;elsecerrNo values to average in FileNameendl;2022-3-27北京郵電大學電信工程學院計算機技術中心38 12.4 12.4 輸入輸入/ /輸出流輸出流2022-3-27北京郵電大學電信工程學院計算機技術中心-39-輸入輸出流類輸入輸出流類iostreamiostream,該類對象可以該類對象可以是數(shù)據(jù)的源或目的。是數(shù)據(jù)的源或目的。iostreamiostream類

29、有一個重要的派生類:類有一個重要的派生類:fstreamfstream,它支持磁盤文件的輸入和輸出,它支持磁盤文件的輸入和輸出,如果程序需要對同一個磁盤文件既要讀如果程序需要對同一個磁盤文件既要讀又要寫,可以構造一個又要寫,可以構造一個fstreamfstream對象。對象。 12.4 12.4 輸入輸入/ /輸出流輸出流 2022-3-27北京郵電大學電信工程學院計算機技術中心-40-#include #include using namespace std;struct student /聲明新的數(shù)據(jù)類型聲明新的數(shù)據(jù)類型 long num;/學號學號 char name20; /姓名姓名

30、char sex;/性別性別 int age;/年齡年齡 stu=20041110,zhang hua,M,21;void main()student s1;fstream myfile(student.dat,ios:in|ios:out|ios:app|ios:binary);例例12.1412.14:打開一個已有的文件,在文件中增加一個學生的記錄,并:打開一個已有的文件,在文件中增加一個學生的記錄,并把所有記錄輸出顯示。把所有記錄輸出顯示。 2022-3-27北京郵電大學電信工程學院計算機技術中心-41-if (myfile.good() myfile.write(char*)&stu,

31、 sizeof(stu);myfile.seekg(0);myfile.read(char*) &s1, sizeof(s1);while (!myfile.eof()couts1.num endl;myfile.read(char*) &s1, sizeof(s1);elsecoutCant open file! (istream & ins, MyClass & obj);ostream & operator (ostream & outs, MyClass & obj); 注意:不能將重載的插入和提取運算符定義為類的成注意:不能將重載的插入和提取運算符定義為類的成員函數(shù),只能定義為一般的函數(shù)或者類的友元函數(shù)。員函數(shù),只能定義為一般的函數(shù)或者類的友元函數(shù)。12.5 12.5 重

溫馨提示

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

最新文檔

評論

0/150

提交評論