10 輸入輸出(面向?qū)ο?_第1頁
10 輸入輸出(面向?qū)ο?_第2頁
10 輸入輸出(面向?qū)ο?_第3頁
10 輸入輸出(面向?qū)ο?_第4頁
10 輸入輸出(面向?qū)ο?_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

輸入/輸出面向?qū)ο笸緩街饕獌?nèi)容輸入/輸出(I/O)概述面向控制臺的I/O面向文件的I/O輸入/輸出(I/O)概述輸入/輸出(簡稱I/O)是程序的一個重要組成部分:程序運(yùn)行所需要的數(shù)據(jù)往往要從外設(shè)(如:鍵盤、文件等)得到程序的運(yùn)行結(jié)果通常也要輸出到外設(shè)(如:顯示器、打印機(jī)、文件等)中去。在C++中,輸入/輸出操作不是語言定義的成分,而是由具體的實(shí)現(xiàn)作為標(biāo)準(zhǔn)庫的功能來提供。在C++中,輸入/輸出是一種基于字節(jié)流的操作:在進(jìn)行輸入操作時,可把輸入的數(shù)據(jù)看成逐個字節(jié)地從外設(shè)流入到計算機(jī)內(nèi)存。在進(jìn)行輸出操作時,則把輸出的數(shù)據(jù)看成逐個字節(jié)地從內(nèi)存流出到外設(shè)。在C++的標(biāo)準(zhǔn)庫中,提供了:基于字節(jié)的I/O操作基于C++基本數(shù)據(jù)類型數(shù)據(jù)的I/O操作(在這些操作的內(nèi)部實(shí)現(xiàn)了基本數(shù)據(jù)類型與字節(jié)流之間的轉(zhuǎn)換)輸入/輸出操作往往是帶內(nèi)存緩沖區(qū)的:輸出時,輸出的數(shù)據(jù)先放緩沖區(qū)中,緩沖區(qū)滿了之后再實(shí)際輸出到外設(shè)。輸入時,先從外設(shè)輸入一大塊內(nèi)容放入緩沖區(qū),然后從緩沖區(qū)中逐步輸入數(shù)據(jù)。C++輸入輸出的實(shí)現(xiàn)途徑過程式——通過從C語言保留下來的函數(shù)庫中的輸入/輸出函數(shù)來實(shí)現(xiàn)。如:printfscanf......面向?qū)ο蟆ㄟ^C++的I/O類庫中的類/對象以及重載的操作符“<<”和“>>”來實(shí)現(xiàn)。如:ostream、cout,<<istream、cin,>>......printf和scanf是兩個帶可變參數(shù)的函數(shù),其中第一個參數(shù)為一個格式串,指出后面要輸出的數(shù)據(jù)的類型。例如:inti;doublej;scanf("i=%d,j=%lf",&i,&j);//i=12,j=34.5

printf("i=%d,j=%f\n",i,j);//i=12,j=34.5不是強(qiáng)類型:編譯時刻不進(jìn)行參數(shù)類型檢查,會導(dǎo)致與類型相關(guān)的運(yùn)行錯誤!(類型不安全)編譯時刻一般不對格式串中指定的數(shù)據(jù)類型與所提供的數(shù)據(jù)的實(shí)際類型之間是否一致進(jìn)行的檢查,當(dāng)格式串描述與數(shù)據(jù)不一致時會導(dǎo)致運(yùn)行時刻的錯誤。例如:scanf("i=%d,j=%d",&i,&j);//類型不一致printf("i=%d,j=%d\n",i,j);//類型不一致scanf("i=%d",&i,&j);//個數(shù)不一致printf("i=%d,j=%f\n",i);//個數(shù)不一致printf、scanf的缺陷不需要單獨(dú)指定數(shù)據(jù)的類型和個數(shù),編譯時刻根據(jù)數(shù)據(jù)本身來決定操作的類型和個數(shù),這樣可避免與類型和個數(shù)相關(guān)的錯誤!inti;doublej;cout<<"i=";

cin>>i;cout<<"j=";cin>>j;cout<<"i="<<i<<",j="<<j<<endl;cout、cin的優(yōu)勢I/O的分類面向控制臺的I/O從標(biāo)準(zhǔn)輸入設(shè)備(如:鍵盤)獲得數(shù)據(jù)把程序結(jié)果從標(biāo)準(zhǔn)輸出設(shè)備(如:顯示器)輸出面向文件的I/O從外存(文件)獲得數(shù)據(jù)把程序結(jié)果保存到外存(文件)中面向字符串變量的I/O從程序中的字符串變量中獲得數(shù)據(jù)把程序結(jié)果保存到字符串變量中C++的I/O類庫中基本的類C++標(biāo)準(zhǔn)類庫提供了以下的類來實(shí)現(xiàn)各種輸入/輸出功能,其中,面向字符串變量的I/O現(xiàn)在已被STL中的string替代。ios

istream(控制臺輸入)

ostream(控制臺輸出)

ifstream(文件輸入)

istrstream(字符串變量輸入)

ofstream(文件輸出)

ostrstream(字符串變量輸出)

iostream(輸入/輸出)

fstream(文件輸入/輸出)

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

在進(jìn)行輸入/輸出時,首先創(chuàng)建某個I/O類的對象,然后,調(diào)用該對象類的成員函數(shù)進(jìn)行基于字節(jié)流的輸入/輸出操作。例如:輸入 istream

in(...);

in.get(ch);//讀入一個字節(jié),ch為一個字符變量

in.read(p,100);//讀入100個字節(jié),p是內(nèi)存空間首地址或

in.get(ch).read(p,100);輸出 ostreamout(...);

out.put(ch);//輸出一個字節(jié),ch為一個字符變量

out.write(p,100);//把p指向的內(nèi)存中100個字節(jié)輸出或

out.put(ch).write(p,100);istream類和ostream類以及它們的派生類還分別重載了操作符“>>”(抽取)和“<<”(插入),用它們可以進(jìn)行C++基本類型數(shù)據(jù)的輸入/輸出操作。例如:輸入 istream

in(...); in>>x;//x是一個基本數(shù)據(jù)類型的變量 in>>y;//y是一個基本數(shù)據(jù)類型的變量或 in>>x>>y;輸出 ostreamout(...); out<<e1;//e1是一個表達(dá)式 out<<e2;//e2是一個表達(dá)式或 out<<e1<<e2;面向控制臺的I/O

在I/O類庫中預(yù)定義了四個I/O對象,可以直接用來進(jìn)行控制臺的輸入/輸出操作:

cin(istream類的對象):對應(yīng)著計算機(jī)系統(tǒng)的標(biāo)準(zhǔn)輸入設(shè)備。(通常為鍵盤)cout(ostream類的對象):對應(yīng)著計算機(jī)系統(tǒng)的標(biāo)準(zhǔn)輸出設(shè)備。(通常為顯示器)cerr和clog(ostream類的對象):對應(yīng)著計算機(jī)系統(tǒng)用于輸出特殊信息(如程序錯誤信息)的設(shè)備。(通常也對應(yīng)著顯示器,但不受輸出重定向的影響)。cerr為不帶緩沖的,clog為帶緩沖的。在進(jìn)行控制臺輸入/輸出時,程序中需要有下面的包含命令:

#include<iostream>輸入/輸出重定向C>prog.exe<a.txt>b.txt程序中cin從文件a.txt中輸入程序中cout輸出到文件b.txt中控制臺輸出操作用插入操作符(<<)進(jìn)行基本數(shù)據(jù)類型數(shù)據(jù)的輸出。例如:#include<iostream>usingnamespacestd;......intx;floatf;charch;int*p=&x;......cout<<x;//輸出x的值。cout<<f;//輸出f的值。cout<<ch;//輸出ch的值。cout<<"hello";//輸出字符串"hello"。cout<<p;//輸出變量p的值,即,變量x的地址。或cout<<x<<f<<ch<<"hello"<<p;輸出指向字符的指針時,并不是輸出指針的值,而是輸出它指向的字符串。例如:char*p;......cout<<p;//輸出p指向的字符串cout<<(void*)p;//輸出p的值輸出格式控制為了對輸出格式進(jìn)行控制,可以通過輸出一些操縱符(manipulator)來實(shí)現(xiàn)。例如:#include<iostream>#include<iomanip>//操縱符聲明的頭文件。usingnamespacestd;.....intx=10;cout<<hex<<x<<endl;//以十六進(jìn)制輸出x的值,然后換行。常用輸出操縱符操縱符含義endl輸出換行符,并執(zhí)行flush操作flush使輸出緩存中的內(nèi)容立即輸出dec十進(jìn)制輸出oct八進(jìn)制輸出hex十六進(jìn)制輸出setprecision(intn)設(shè)置浮點(diǎn)數(shù)的精度(由輸出格式?jīng)Q定是有效數(shù)字的個數(shù)還是小數(shù)點(diǎn)后數(shù)字的位數(shù))setiosflags(longflags)/resetiosflags(longflags)

設(shè)置/重置輸出格式,flags的取值可以是:ios::scientific(以指數(shù)形式顯示浮點(diǎn)數(shù)),ios::fixed(以小數(shù)形式顯示浮點(diǎn)數(shù)),等等對于浮點(diǎn)數(shù)(float、double和longdouble):當(dāng)輸出格式為ios::scientific或ios::fixed時,操縱符setprecision用于設(shè)置浮點(diǎn)數(shù)小數(shù)點(diǎn)后面的位數(shù);當(dāng)輸出格式為自動方式(既不是ios::scientific也不是ios::fixed,或兩者都設(shè)了)時,操縱符setprecision用于設(shè)置浮點(diǎn)數(shù)有效數(shù)字的個數(shù),這時的輸出格式根據(jù)有效數(shù)字自動確定。

用ostream類的成員函數(shù)進(jìn)行基于字節(jié)的輸出操作。例如://輸出一個字節(jié)。ostream&ostream::put(charch);cout.put('A');//輸出p所指向的內(nèi)存空間中count個字節(jié)。ostream&ostream::write(constchar*p,intcount);charinfo[100];intn;......cout.write(info,n);控制臺輸入操作用抽取操作符(>>)進(jìn)行基本數(shù)據(jù)類型數(shù)據(jù)的輸入。例如:#include<iostream>usingnamespacestd;......intx;doubley;charstr[10];cin>>x;cin>>y;cin>>str;或者cin>>x>>y>>str;在輸入時,各個數(shù)據(jù)之間一般要用空白符(空格、\t、\n)分開:輸入一個數(shù)據(jù)前,先跳過空白符輸入一個數(shù)據(jù)的過程中,碰到空白符或當(dāng)前數(shù)據(jù)類型不允許的字符時結(jié)束當(dāng)前數(shù)據(jù)的輸入可以通過一些操縱符來控制輸入的行為,例如:charstr[10];cin>>setw(10)>>str;//把輸入的字符串和一個'\0'

//放入str中,最多輸入9個字符。用istream類的成員函數(shù)進(jìn)行基于字節(jié)的輸入操作。例如://輸入一個字節(jié)。istream&istream::get(char&ch);//輸入count個字節(jié)至p所指向的內(nèi)存空間中。istream&istream::read(char*p,intcount);//輸入一個字符串。輸入過程直到輸入了count-1個字符或//遇到delim指定的字符為止,并自動加上一個'\0'字符。istream&istream::getline(char*p,intcount,

chardelim='\n');用上述函數(shù)可以輸入空白符!例如,

charstr[10];

cin.getline(str,10);//可以輸入帶空格的字符串操作符“>>”和“<<”的重載

標(biāo)準(zhǔn)庫中重載的操作符“>>”和“<<”只能對基本數(shù)據(jù)類型的數(shù)據(jù)進(jìn)行輸入/輸出??梢葬槍ψ远x的類進(jìn)一步重載操作符“>>”和“<<”,從而實(shí)現(xiàn)能用它們對某個類的對象進(jìn)行輸入/輸出操作。

例:插入操作符“<<”的重載

針對類A重載操作符“<<”,實(shí)現(xiàn)A類對象的輸出:classA{ intx,y; public: ...... friendostream&operator<<(ostream&out,constA&a);};ostream&operator<<(ostream&out,constA&a){ out<<a.x<<','<<a.y; returnout;}.....Aa1,a2;cout<<a1<<endl<<a2<<endl;面向文件的I/O需求:程序運(yùn)行結(jié)果有時需要永久性地保存起來,以供其它程序或本程序下一次運(yùn)行時使用。程序運(yùn)行所需要的數(shù)據(jù)也常常要從其它程序或本程序上一次運(yùn)行所保存的數(shù)據(jù)中獲得。用于永久性保存數(shù)據(jù)的設(shè)備稱為外部存儲器(簡稱:外存),如:磁盤、磁帶、光盤等。在外存中保存數(shù)據(jù)的方式通常有兩種:文件數(shù)據(jù)庫本課程只介紹以文件方式來永久性地保存數(shù)據(jù)。文件數(shù)據(jù)的存儲方式

文本方式(text)只包含可顯示的字符和有限的幾個控制字符(如:‘\r’、‘\n’、‘\t’等)的編碼。一般用于存儲具有“行”結(jié)構(gòu)的文字?jǐn)?shù)據(jù),數(shù)據(jù)可用記事本等軟件打開察看。二進(jìn)制方式(binary)

包含任意的沒有顯式含義的純二進(jìn)制字節(jié)。一般用于存儲任意結(jié)構(gòu)的數(shù)據(jù),數(shù)據(jù)由使用它的應(yīng)用程序來解釋。例如,對于一個整數(shù)1234567文本方式:按字符串把字符1、2、3、4、5、6、7的ASCII碼依次寫入文件。(共7個字節(jié))

二進(jìn)制方式:按1234567的int型機(jī)內(nèi)表示(0012D687)把它逐個字節(jié)依次寫入文件。(共4個字節(jié))文件的讀寫過程在外存(如磁盤)中,每個文件都有一個名字(文件名)(操作系統(tǒng)一般采用樹型的目錄結(jié)構(gòu)來管理外存中的文件)。對文件數(shù)據(jù)進(jìn)行讀寫的過程:打開文件:把程序內(nèi)部的一個表示文件的變量/對象與外部的一個具體文件關(guān)聯(lián)起來,并創(chuàng)建內(nèi)存緩沖區(qū)。文件讀/寫:存取文件中的內(nèi)容。關(guān)閉文件:把暫存在內(nèi)存緩沖區(qū)中的內(nèi)容寫入到文件中,并歸還打開文件時申請的內(nèi)存資源(包括內(nèi)存緩沖區(qū))。

文件的位置指針在C++中,把文件看成是由一系列字節(jié)所構(gòu)成的字節(jié)串,對文件中數(shù)據(jù)的操作(輸入/輸出)通常是逐個字節(jié)順序進(jìn)行,因此稱為流式文件。

每個打開的文件都有一個內(nèi)部(隱藏)的位置指針,它指出文件的當(dāng)前讀寫位置。進(jìn)行讀/寫操作時,每讀入/寫出一個字節(jié),文件位置指針會自動往后移動一個字節(jié)的位置。位置指針

在利用I/O類庫中的類進(jìn)行文件的輸入/輸出時,程序中需要包含下面的頭文件:

#include<iostream>#include<fstream>文件的輸出操作

打開文件:創(chuàng)建一個ofstream類的對象,并建立與外部某個文件之間的聯(lián)系。直接方式ofstreamout_file(<文件名>[,<打開方式>]);例如:ofstreamout_file("d:\\myfile.txt",ios::out);間接方式ofstreamout_file; out_file.open(<文件名>[,<打開方式>]);

例如:out_file.open("d:\\myfile.txt",ios::out);打開方式

ios::out打開一個外部文件用于寫操作。如果外部文件已存在,則首先把它的內(nèi)容清除;否則,先創(chuàng)建該外部文件。ios::out是默認(rèn)打開方式。ios::app打開一個外部文件用于添加操作。(不清除文件內(nèi)容,文件位置指針在末尾)如果外部文件不存在,則先創(chuàng)建該外部文件。

ios::out|ios::binary或ios::app|ios::binary按二進(jìn)制方式打開文件。(默認(rèn)的是文本方式)文本方式與二進(jìn)制方式的區(qū)別:對以文本方式打開的文件,當(dāng)輸出的字符為'\n'時,在某些平臺上(如:DOS和Windows平臺)將自動把它轉(zhuǎn)換成'\r'和'\n'兩個字符寫入外部文件。對以二進(jìn)制方式打開的文件,對輸出的字節(jié)不做任何轉(zhuǎn)換,原樣輸出。判斷打開操作是否成功打開文件時,必須要對文件打開操作的成功與否進(jìn)行判斷。判斷文件是否成功打開可以采用以下方式:

if(!out_file.is_open())//或:out_file.fail() //或:!out_file{......//失敗處理}

文件成功打開后,可以使用插入操作符“<<”或ofstream類的一些成員函數(shù)來進(jìn)行文件數(shù)據(jù)的輸出操作,例如:

intx=12;doubley=12.3;......//以文本方式輸出數(shù)據(jù)ofstreamout_file("d:\\myfile.txt",ios::out);if(!out_file)exit(-1);out_file<<x<<''<<y<<endl;//輸出:1212.3或//以二進(jìn)制方式輸出數(shù)據(jù)ofstreamout_file("d:\\myfile.dat",ios::out|ios::binary);if(!out_file)exit(-1);out_file.write((char*)&x,sizeof(x));//輸出:4個字節(jié)out_file.write((char*)&y,sizeof(y));//輸出:8個字節(jié)輸出數(shù)據(jù)structStudent{intno;

charname[10];

intscores[5];}s1={161220042,"張三",{90,95,85,75,95}};//以文本方式輸出數(shù)據(jù)ofstreamout_file("d:\\students.txt",ios::out);if(!out_file)exit(-1);out_file<<s1.no<<''<<;for(inti=0;i<5;i++)

out_file<<''<<s1.scores[i];out_file<<endl;//以二進(jìn)制方式輸出數(shù)據(jù)ofstreamout_file("d:\\students.dat",ios::out|ios::binary);if(!out_file)exit(-1);out_file.write((char*)&s1,sizeof(s1));文件輸出操作結(jié)束時,要使用ofstream的成員函數(shù)close關(guān)閉文件:out_file.close();

關(guān)閉文件的目的:把文件內(nèi)存緩沖區(qū)的內(nèi)容寫到磁盤文件中!程序正常結(jié)束時,系統(tǒng)也會自動關(guān)閉打開的文件。程序中為什么要顯式關(guān)閉文件?文件的輸入操作打開文件:創(chuàng)建一個ifstream類的對象,并與外部文件建立聯(lián)系。直接方式ifstreamin_file(<文件名>[,<打開方式>]);間接方式ifstreamin_file;in_file.open(<文件名>[,<打開方式>]);

打開方式ios::in打開一個外部文件用于讀操作。(默認(rèn))ios::in|ios::binary按二進(jìn)制方式打開文件。(默認(rèn)為文本方式)對以文本方式打開的文件,當(dāng)讀入的字符為連續(xù)的'\r'和'\n'兩個字符時,在某些平臺上(如:DOS和Windows平臺)將自動轉(zhuǎn)換成一個字符'\n'。對以二進(jìn)制方式打開的文件,對輸入的字節(jié)不做任何轉(zhuǎn)換,原樣輸入。打開文件時要判斷打開是否成功。判斷方式與文件輸出打開操作的判斷一樣。文件成功打開后,可以使用抽取操作符“>>”或ifstream類的一些成員函數(shù)來進(jìn)行文件的輸入操作,例如:

intx;doubley;......//以文本方式輸入數(shù)據(jù)ifstreamin_file("D:\\myfile.txt",ios::in);if(!in_file)exit(-1);in_file>>x>>y;//以二進(jìn)制方式輸入數(shù)據(jù)ifstreamin_file("D:\\myfile.dat",ios::in|ios::binary);if(!in_file)exit(-1);in_file.read((char*)&x,sizeof(x));in_file.read((char*)&y,sizeof(y));注意:從文件輸入必須要知道文件中數(shù)據(jù)的存儲方式和格式!structStudent{intno;charname[10];intscores[5];}s1;//以文本方式輸入數(shù)據(jù)ifstreamin_file("d:\\students.txt",ios::in);if(!in_file)exit(-1);in_file>>s1.no>>;for(inti=0;i<5;i++)in_file>>s1.scores[i];//以二進(jìn)制方式輸入數(shù)據(jù)ifstreamin_file("d:\\students.dat",ios::in|ios::binary);if(!in_file)exit(-1);in_file.read((char*)&s1,sizeof(s1));讀取數(shù)據(jù)過程中有時需要判斷是否正確讀入了數(shù)據(jù)(尤其是在文件末尾處)。判斷是否正確讀入了數(shù)據(jù),可以調(diào)用ios類的成員函數(shù)fail來實(shí)現(xiàn):boolios::fail()const;該函數(shù)返回true表示文件操作失?。环祷豧alse表示操作成功。例:從文件讀入一系列整型數(shù)......ifstreamin_file("d:\\myfile.txt",ios::in);if(!in_file)exit(-1);intx;in_file

>>

x;//讀入第一個整型數(shù)

while

(!in_file.fail())

{

......

//使用x的值

in_file

>>

x;//讀入下一個整型數(shù)

}in_file.close();......文件中的數(shù)據(jù)形式1

2

3

4\n

------------------1\n

2\n

3\n

4\n

------------------

1

2

3

4

------------------1\n

2\n

3\n

4structStudent{intno;charname[10];intscores[5];}s1;ifstreamin_file("d:\\students.txt",ios::in);if(!in_file)exit(-1);in_file>>s1.no;//讀入第一個學(xué)號while(!in_file.fail()){in_file>>;for(inti=0;i<5;i++)in_file>>s1.scores[i];

......//使用s1中讀入的當(dāng)前學(xué)生數(shù)據(jù)

in_file>>s1.no;//讀入下一個學(xué)號}in_file.close();例:從文件讀入一系列學(xué)生數(shù)據(jù)文件中的數(shù)據(jù)形式1001

張三9288709085\n

1002

李四9080909588\n1003

王五

9585809280\n......文件輸入操作結(jié)束后,要使用ifstream的一個成員函數(shù)close關(guān)閉文件:in_file.close();

有關(guān)文件讀寫的幾點(diǎn)注意以文本方式輸出的文件要以文本方式輸入;以二進(jìn)制方式輸出的文件要以二進(jìn)制方式輸入!以文本方式讀寫的文件要以

溫馨提示

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

最新文檔

評論

0/150

提交評論