青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

C++的iostream標(biāo)準(zhǔn)庫(kù)介紹

作者:管寧

0 為什么需要iostream

我們從一開(kāi)始就一直在利用C++的輸入輸出在做著各種練習(xí),輸入輸出是由iostream庫(kù)提供的,所以討論此標(biāo)準(zhǔn)庫(kù)是有必要的,它與C語(yǔ)言的 stdio庫(kù)不同,它從一開(kāi)始就是用多重繼承與虛擬繼承實(shí)現(xiàn)的面向?qū)ο蟮膶哟谓Y(jié)構(gòu),作為一個(gè)c++的標(biāo)準(zhǔn)庫(kù)組件提供給程序員使用。

  iostream為內(nèi)置類型類型對(duì)象提供了輸入輸出支持,同時(shí)也支持文件的輸入輸出,類的設(shè)計(jì)者可以通過(guò)對(duì)iostream庫(kù)的擴(kuò)展,來(lái)支持自定義類型的輸入輸出操作。

  為什么說(shuō)要擴(kuò)展才能提供支持呢?我們來(lái)一個(gè)示例。

#include?<stdio.h>?
#include?
<iostream>?
using?namespace?std;?????

class?Test?
{?
????????
public:?
????????Test(
int?a=0,int?b=0)?
????????
{?
????????????????Test::a
=a;?
????????????????Test::b
=b;?
????????}
?
????????
int?a;?
????????
int?b;?
}
;?
int?main()?
{?
????????Test?t(
100,50);?
????????printf(
"%???",t);//不明確的輸出格式?
????????scanf("%???",t);//不明確的輸入格式?
????????cout<<t<<endl;//同樣不夠明確?
????????cin>>t;//同樣不夠明確?
????????system("pause");?
}
  由于自定義類的特殊性,在上面的代碼中,無(wú)論你使用c風(fēng)格的輸入輸出,或者是c++的輸入輸出都不是不明確的一個(gè)表示,由于c語(yǔ)言沒(méi)有運(yùn)算符重載機(jī)制,導(dǎo)致stdio庫(kù)的不可擴(kuò)充性,讓我們無(wú)法讓printf()和scanf()支持對(duì)自定義類對(duì)象的擴(kuò)充識(shí)別,而c++是可以通過(guò)運(yùn)算符重載機(jī)制擴(kuò)充 iostream庫(kù)的,使系統(tǒng)能能夠識(shí)別自定義類型,從而讓輸入輸出明確的知道他們?cè)摳墒裁矗袷绞鞘裁础?

  在上例中我們之所以用printf與cout進(jìn)行對(duì)比目的是為了告訴大家,C與C++處理輸入輸出的根本不同,我們從c遠(yuǎn)的輸入輸出可以很明顯看出是函數(shù)調(diào)用方式,而c++的則是對(duì)象模式,cout和cin是ostream類和istream類的對(duì)象。

1 iostream: istream 和 ostream

  C++中的iostream庫(kù)主要包含下圖所示的幾個(gè)頭文件:
IOSstream 庫(kù)
fstream iomainip
ios iosfwd
iostream istream
ostream sstream
streambuf strstream

  我們所熟悉的輸入輸出操作分別是由istream(輸入流)和ostream(輸出流)這兩個(gè)類提供的,為了允許雙向的輸入/輸出,由istream和ostream派生出了iostream類。

  類的繼承關(guān)系見(jiàn)下圖:

iostream庫(kù)定義了以下三個(gè)標(biāo)準(zhǔn)流對(duì)象:

  1. cin,表示標(biāo)準(zhǔn)輸入(standard input)的istream類對(duì)象。cin使我們可以從設(shè)備讀如數(shù)據(jù)。
  2. cout,表示標(biāo)準(zhǔn)輸出(standard output)的ostream類對(duì)象。cout使我們可以向設(shè)備輸出或者寫數(shù)據(jù)。
  3. cerr,表示標(biāo)準(zhǔn)錯(cuò)誤(standard error)的osttream類對(duì)象。cerr是導(dǎo)出程序錯(cuò)誤消息的地方,它只能允許向屏幕設(shè)備寫數(shù)據(jù)。

  輸出主要由重載的左移操作符(<<)來(lái)完成,輸入主要由重載的右移操作符(>>)完成:

  1. >>a表示將數(shù)據(jù)放入a對(duì)象中。
  2. <<a表示將a對(duì)象中存儲(chǔ)的數(shù)據(jù)拿出。

  這些標(biāo)準(zhǔn)的流對(duì)象都有默認(rèn)的所對(duì)應(yīng)的設(shè)備,見(jiàn)下表:

C++對(duì)象名設(shè)備名稱C中標(biāo)準(zhǔn)設(shè)備名默認(rèn)含義
cin 鍵盤 stdin 標(biāo)準(zhǔn)輸入
cout 顯示器屏幕 stdout 標(biāo)準(zhǔn)輸出
cerr 顯示器屏幕 stderr 標(biāo)準(zhǔn)錯(cuò)誤輸出
  上表中的意思表明cin對(duì)象的默認(rèn)輸入設(shè)備是鍵盤,cout對(duì)象的默認(rèn)輸出設(shè)備是顯示器屏幕。

  那么原理上C++有是如何利用cin/cout對(duì)象與左移和右移運(yùn)算符重載來(lái)實(shí)現(xiàn)輸入輸出的呢?

  下面我們以輸出為例,說(shuō)明其實(shí)現(xiàn)原理:

  1. cout是ostream類的對(duì)象,因?yàn)樗赶虻氖菢?biāo)準(zhǔn)設(shè)備(顯示器屏幕),所以它在iostream頭文件中作為全局對(duì)象進(jìn)行定義。
  2. ostream cout(stdout);//其默認(rèn)指向的C中的標(biāo)準(zhǔn)設(shè)備名,作為其構(gòu)造函數(shù)的參數(shù)使用。
  3. 在iostream.h頭文件中,ostream類對(duì)應(yīng)每個(gè)基本數(shù)據(jù)類型都有其友元函數(shù)對(duì)左移操作符進(jìn)行了友元函數(shù)的重載。
    • ostream& operator<<(ostream &temp,int source);
    • ostream& operator<<(ostream &temp,char *ps);
    • ... 等等

  一句輸出語(yǔ)句:cout<<"www.cndev-lab.com";,事實(shí)上調(diào)用的就是ostream& operator<<(ostream &temp,char *ps);這個(gè)運(yùn)算符重載函數(shù),由于返回的是流對(duì)象的引用,引用可以作為左值使用,所以當(dāng)程序中有類似cout<<"www.cndev- lab.com"<<"中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室";這樣的語(yǔ)句出現(xiàn)的時(shí)候,就能夠構(gòu)成連續(xù)輸出。

  由于iostream庫(kù)不光支持對(duì)象的輸入輸出,同時(shí)也支持文件流的輸入輸出,所以在詳細(xì)講解左移與右移運(yùn)算符重載只前,我們有必要先對(duì)文件的輸入輸出以及輸入輸出的控制符有所了解。

2 fstream: ifstream 和 ofstream

  和文件有關(guān)系的輸入輸出類主要在fstream.h這個(gè)頭文件中被定義,在這個(gè)頭文件中主要被定義了三個(gè)類,由這三個(gè)類控制對(duì)文件的各種輸入輸出操作,他們分別是ifstream、ofstream、fstream,其中fstream類是由iostream類派生而來(lái),他們之間的繼承關(guān)系見(jiàn)下圖所示。

由于文件設(shè)備并不像顯示器屏幕與鍵盤那樣是標(biāo)準(zhǔn)默認(rèn)設(shè)備,所以它在fstream.h頭文件中是沒(méi)有像cout那樣預(yù)先定義的全局對(duì)象,所以我們必須自己定義一個(gè)該類的對(duì)象,我們要以文件作為設(shè)備向文件輸出信息(也就是向文件寫數(shù)據(jù)),那么就應(yīng)該使用ofstream類。

  ofstream類的默認(rèn)構(gòu)造函數(shù)原形為:

  ofstream::ofstream(constchar *filename,int mode = ios::out,int openprot = filebuf::openprot);
  • filename:  要打開(kāi)的文件名
  • mode:    要打開(kāi)文件的方式
  • prot:    打開(kāi)文件的屬性

  其中mode和openprot這兩個(gè)參數(shù)的可選項(xiàng)表見(jiàn)下表:

mode屬性表
ios::app 以追加的方式打開(kāi)文件
ios::ate 文件打開(kāi)后定位到文件尾,ios:app就包含有此屬性
ios::binary 以二進(jìn)制方式打開(kāi)文件,缺省的方式是文本方式。兩種方式的區(qū)別見(jiàn)前文
ios::in 文件以輸入方式打開(kāi)
ios::out 文件以輸出方式打開(kāi)
ios::trunc 如果文件存在,把文件長(zhǎng)度設(shè)為0
  可以用“或”把以上屬性連接起來(lái),如ios::out|ios::binary。
openprot屬性表
屬性 含義
0 普通文件,打開(kāi)訪問(wèn)
1 只讀文件
2 隱含文件
4 系統(tǒng)文件
  可以用“或”或者“+”把以上屬性連接起來(lái) ,如3或1|2就是以只讀和隱含屬性打開(kāi)文件。

實(shí)例代碼如下:

#include?<fstream>?
using?namespace?std;?

int?main()??
{?
????????ofstream?myfile(
"c:\\1.txt",ios::out|ios::trunc,0);?
????????myfile
<<"中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室"<<endl<<"網(wǎng)址:"<<"www.cndev-lab.com";?
????????myfile.close()?
????????system(
"pause");?
}
  文件使用完后可以使用close成員函數(shù)關(guān)閉文件。

  ios::app為追加模式,在使用追加模式的時(shí)候同時(shí)進(jìn)行文件狀態(tài)的判斷是一個(gè)比較好的習(xí)慣。

  示例如下:

#include?<iostream>?
#include?
<fstream>?
using?namespace?std;?
int?main()??
{?
????????ofstream?myfile(
"c:\\1.txt",ios::app,0);?
????????
if(!myfile)//或者寫成myfile.fail()?
????????{?
????????????????cout
<<"文件打開(kāi)失敗,目標(biāo)文件狀態(tài)可能為只讀!";?
????????????????system(
"pause");?
????????????????exit(
1);?
????????}
?
????????myfile
<<"中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室"<<endl<<"網(wǎng)址:"<<"www.cndev-lab.com"<<endl;?
????????myfile.close();?
}

  在定義ifstream和ofstream類對(duì)象的時(shí)候,我們也可以不指定文件。以后可以通過(guò)成員函數(shù)open()顯式的把一個(gè)文件連接到一個(gè)類對(duì)象上。

  例如:

#include?<iostream>?
#include?
<fstream>?
using?namespace?std;?
int?main()??
{?
????????ofstream?myfile;?
????????myfile.open(
"c:\\1.txt",ios::out|ios::app,0);?
????????
if(!myfile)//或者寫成myfile.fail()?
????????{?
????????????????cout
<<"文件創(chuàng)建失敗,磁盤不可寫或者文件為只讀!";?
????????????????system(
"pause");?
????????????????exit(
1);?
????????}
?
????????myfile
<<"中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室"<<endl<<"網(wǎng)址:"<<"www.cndev-lab.com"<<endl;?
????????myfile.close();?
}
  下面我們來(lái)看一下是如何利用ifstream類對(duì)象,將文件中的數(shù)據(jù)讀取出來(lái),然后再輸出到標(biāo)準(zhǔn)設(shè)備中的例子。

  代碼如下:

#include?<iostream>?
#include?
<fstream>?
#include?
<string>?
using?namespace?std;?
int?main()??
{?
????????ifstream?myfile;?
????????myfile.open(
"c:\\1.txt",ios::in,0);?
????????
if(!myfile)?
????????
{?
????????????????cout
<<"文件讀錯(cuò)誤";?
????????????????system(
"pause");?
????????????????exit(
1);?
????????}
?
????????
char?ch;?
????????
string?content;?
????????
while(myfile.get(ch))?
????????
{?
????????????????content
+=ch;?
????????????????cout.put(ch);
//cout<<ch;這么寫也是可以的?
????????}
?
????????myfile.close();?
????????cout
<<content;?
????????system(
"pause");?
}
  上例中,我們利用成員函數(shù)get(),逐一的讀取文件中的有效字符,再利用put()成員函數(shù),將文件中的數(shù)據(jù)通過(guò)循環(huán)逐一輸出到標(biāo)準(zhǔn)設(shè)備(屏幕)上, get()成員函數(shù)會(huì)在文件讀到默尾的時(shí)候返回假值,所以我們可以利用它的這個(gè)特性作為while循環(huán)的終止條件,我們同時(shí)也在上例中引入了C++風(fēng)格的字符串類型string,在循環(huán)讀取的時(shí)候逐一保存到content中,要使用string類型,必須包含string.h的頭文件。

我們?cè)诤?jiǎn)單介紹過(guò)ofstream類和ifstream類后,我們?cè)賮?lái)看一下fstream類,fstream類是由iostream派生而來(lái),fstream類對(duì)象可以同對(duì)文件進(jìn)行讀寫操作。

  示例代碼如下:

#include?<iostream>?
#include?
<fstream>?
using?namespace?std;?
int?main()??
{?
????????fstream?myfile;?
????????myfile.open(
"c:\\1.txt",ios::out|ios::app,0);?
????????
if(!myfile)?
????????
{?
????????????????cout
<<"文件寫錯(cuò)誤,文件屬性可能為只讀!"<<endl;?
????????????????system(
"pause");?
????????????????exit(
1);?
????????}
?
????????myfile
<<"中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室"<<endl<<"網(wǎng)址:"<<"www.cndev-lab.com"<<endl;???
????????myfile.close();?
????????
????????myfile.open(
"c:\\1.txt",ios::in,0);?
????????
if(!myfile)?
????????
{?
????????????????cout
<<"文件讀錯(cuò)誤,文件可能丟失!"<<endl;?
????????????????system(
"pause");?
????????????????exit(
1);?
????????}
?
????????
char?ch;?
????????
while(myfile.get(ch))?
????????
{?
????????????????cout.put(ch);?
????????}
?
????????myfile.close();?
????????system(
"pause");?
}
  由于fstream類可以對(duì)文件同時(shí)進(jìn)行讀寫操作,所以對(duì)它的對(duì)象進(jìn)行初始話的時(shí)候一定要顯式的指定mode和openprot參數(shù)。

  接下來(lái)我們來(lái)學(xué)習(xí)一下串流類的基礎(chǔ)知識(shí),什么叫串流類?

3 strstream: ostrstream 和 istrstream

  簡(jiǎn)單的理解就是能夠控制字符串類型對(duì)象進(jìn)行輸入輸出的類,C++不光可以支持C++風(fēng)格的字符串流控制,還可以支持C風(fēng)格的字符串流控制。

  我們先看看看C++是如何對(duì)C風(fēng)格的字符串流進(jìn)行控制的,C中的字符串其實(shí)也就是字符數(shù)組,字符數(shù)組內(nèi)的數(shù)據(jù)在內(nèi)存中的位置的排列是連續(xù)的,我們通常用 char str[size]或者char *str的方式聲明創(chuàng)建C風(fēng)格字符數(shù)組,為了能讓字符數(shù)組作為設(shè)備并提供輸入輸出操作,C++引入了ostrstream、istrstream、 strstream這三個(gè)類,要使用他們創(chuàng)建對(duì)象就必須包含strstream.h頭文件。

  • istrstream類用于執(zhí)行C風(fēng)格的串流的輸入操作,也就是以字符串?dāng)?shù)組作為輸入設(shè)備。
  • ostrstream類用于執(zhí)行C風(fēng)格的串流的輸出操作,也就是一字符串?dāng)?shù)組作為輸出設(shè)備。
  • strstream類同時(shí)可以支持C風(fēng)格的串流的輸入輸出操作。

  istrstream類是從istream(輸入流類)和strstreambase(字符串流基類)派生而來(lái),ostrstream是從 ostream(輸出流類)和strstreambase(字符串流基類)派生而來(lái),strstream則是從iostream(輸入輸出流類)和和 strstreambase(字符串流基類)派生而來(lái)。

  他們的繼承關(guān)系如下圖所示:

  串流同樣不是標(biāo)準(zhǔn)設(shè)備,不會(huì)有預(yù)先定義好的全局對(duì)象,所以不能直接操作,需要通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象。

類istrstream的構(gòu)造函數(shù)原形如下:

  istrstream::istrstream(constchar *str,int size);
  參數(shù)1表示字符串?dāng)?shù)組,而參數(shù)2表示數(shù)組大小,當(dāng)size為0時(shí),表示istrstream類對(duì)象直接連接到由str所指向的內(nèi)存空間并以\0結(jié)尾的字符串。

  下面的示例代碼就是利用istrstream類創(chuàng)建類對(duì)象,制定流輸入設(shè)備為字符串?dāng)?shù)組,通過(guò)它向一個(gè)字符型對(duì)象輸入數(shù)據(jù)。代碼如下:

#include?<iostream>?
#include?
<strstream>?
using?namespace?std;?
int?main()??
{?
????????
char?*name?=?"www.cndev-lab.com";?
????????
int?arraysize?=?strlen(name)+1;?
????????istrstream?
is(name,arraysize);?
????????
char?temp;?
????????
is>>temp;?
????????cout
<<temp;?
????????system(
"pause");?
}
  類ostrstream用于執(zhí)行串流的輸出,它的構(gòu)造函數(shù)如下所示:
  ostrstream::ostrstream(char *_Ptr,int streamsize,int Mode = ios::out);
  第一個(gè)參數(shù)是字符數(shù)組,第二個(gè)是說(shuō)明數(shù)組的大小,第三個(gè)參數(shù)是指打開(kāi)方式。

  我們來(lái)一個(gè)示例代碼:

#include?<iostream>?
#include?
<strstream>?
using?namespace?std;?
int?main()??
{?
????????
int?arraysize=1;?
????????
char?*pbuffer=new?char[arraysize];?
????????ostrstream?ostr(pbuffer,arraysize,ios::
out);?
????????ostr
<<arraysize<<ends;//使用ostrstream輸出到流對(duì)象的時(shí)候,要用ends結(jié)束字符串?
????????cout<<pbuffer;?
????????delete[]?pbuffer;?
????????system(
"pause");?
}
  上面的代碼中,我們創(chuàng)建一個(gè)c風(fēng)格的串流輸出對(duì)象ostr,我們將arraysize內(nèi)的數(shù)據(jù)成功的以字符串的形式輸出到了ostr對(duì)象所指向的pbuffer指針的堆空間中,pbuffer也正是我們要輸出的字符串?dāng)?shù)組,在結(jié)尾要使用ends結(jié)束字符串,如果不這么做就有溢出的危險(xiǎn)。

4 stringstream

對(duì)于stringstream了來(lái)說(shuō),不用我多說(shuō),大家也已經(jīng)知道它是用于C++風(fēng)格的字符串的輸入輸出的?! tringstream的構(gòu)造函數(shù)原形如下:
  stringstream::stringstream(string?str);
  示例代碼如下:
#include?<iostream>?
#include?
<sstream>?
#include?
<string>?
using?namespace?std;?

int?main()??
{?
????????stringstream?ostr(
"ccc");?
????????ostr.put(
'd');?
????????ostr.put(
'e');?
????????ostr
<<"fg";?
????????
string?gstr?=?ostr.str();?
????????cout
<<gstr<<endl;?
????????
????????
char?a;?
????????ostr
>>a;?
????????cout
<<a?
????????
????????system(
"pause");?
}
  除此而外,stringstream類的對(duì)象我們還常用它進(jìn)行string與各種內(nèi)置類型數(shù)據(jù)之間的轉(zhuǎn)換。示例代碼如下:
#include?<iostream>?
#include?
<sstream>?
#include?
<string>?
using?namespace?std;?

int?main()??
{?
????????stringstream?sstr;?
????????
//--------int轉(zhuǎn)string-----------?
????????int?a=100;?
????????
string?str;?
????????sstr
<<a;?
????????sstr
>>str;?
????????cout
<<str<<endl;?
????????
//--------string轉(zhuǎn)char[]--------?
????????sstr.clear();//如果你想通過(guò)使用同一stringstream對(duì)象實(shí)現(xiàn)多種類型的轉(zhuǎn)換,請(qǐng)注意在每一次轉(zhuǎn)換之后都必須調(diào)用clear()成員函數(shù)。?
????????string?name?=?"colinguan";?
????????
char?cname[200];?
????????sstr
<<name;?
????????sstr
>>cname;?
????????cout
<<cname;?
????????system(
"pause");?
}
  接下來(lái)我們來(lái)學(xué)習(xí)一下輸入/輸出的狀態(tài)標(biāo)志的相關(guān)知識(shí).

5 io_state 輸入/輸出的狀態(tài)標(biāo)志

C++中負(fù)責(zé)的輸入/輸出的系統(tǒng)包括了關(guān)于每一個(gè)輸入/輸出操作的結(jié)果的記錄信息。這些當(dāng)前的狀態(tài)信息被包含在io_state類型的對(duì)象中。io_state是一個(gè)枚舉類型(就像open_mode一樣),以下便是它包含的值。
  • goodbit 無(wú)錯(cuò)誤
  • Eofbit 已到達(dá)文件尾
  • failbit 非致命的輸入/輸出錯(cuò)誤,可挽回
  • badbit 致命的輸入/輸出錯(cuò)誤,無(wú)法挽回

有兩種方法可以獲得輸入/輸出的狀態(tài)信息。一種方法是通過(guò)調(diào)用rdstate()函數(shù),它將返回當(dāng)前狀態(tài)的錯(cuò)誤標(biāo)記。例如,假如沒(méi)有任何錯(cuò)誤,則rdstate()會(huì)返回goodbit.下例示例,表示出了rdstate()的用法:

#include?<iostream>?
using?namespace?std;?

int?main()??
{?
????????
int?a;?
????????cin
>>a;?
????????cout
<<cin.rdstate()<<endl;?
????????
if(cin.rdstate()?==?ios::goodbit)?
????????
{?
????????????????cout
<<"輸入數(shù)據(jù)的類型正確,無(wú)錯(cuò)誤!"<<endl;?
????????}
?
????????
if(cin.rdstate()?==?ios_base::failbit)?
????????
{?
????????????????cout
<<"輸入數(shù)據(jù)類型錯(cuò)誤,非致命錯(cuò)誤,可清除輸入緩沖區(qū)挽回!"<<endl;?
????????}
?
????????system(
"pause");?
}
  另一種方法則是使用下面任何一個(gè)函數(shù)來(lái)檢測(cè)相應(yīng)的輸入/輸出狀態(tài):
bool?bad();
bool?eof();
bool?fail();
bool?good();

  下例示例,表示出了上面各成員函數(shù)的用法:

#include?<iostream>?
using?namespace?std;?

int?main()??
{?
????????
int?a;?
????????cin
>>a;?
????????cout
<<cin.rdstate()<<endl;?
????????
if(cin.good())?
????????
{?
????????????????cout
<<"輸入數(shù)據(jù)的類型正確,無(wú)錯(cuò)誤!"<<endl;?
????????}
?
????????
if(cin.fail())?
????????
{?
????????????????cout
<<"輸入數(shù)據(jù)類型錯(cuò)誤,非致命錯(cuò)誤,可清除輸入緩沖區(qū)挽回!"<<endl;?
????????}
?
????????system(
"pause");?
}
  如果錯(cuò)誤發(fā)生,那么流狀態(tài)既被標(biāo)記為錯(cuò)誤,你必須清除這些錯(cuò)誤狀態(tài),以使你的程序能正確適當(dāng)?shù)乩^續(xù)運(yùn)行。要清除錯(cuò)誤狀態(tài),需使用clear()函數(shù)。此函數(shù)帶一個(gè)參數(shù),它是你將要設(shè)為當(dāng)前狀態(tài)的標(biāo)志值。,只要將ios::goodbit作為實(shí)參。

  示例代碼如下:

#include?<iostream>?
using?namespace?std;?

int?main()??
{?
????????
int?a;?
????????cin
>>a;?
????????cout
<<cin.rdstate()<<endl;?
????????cin.clear(ios::goodbit);?
????????cout
<<cin.rdstate()<<endl;?
????????system(
"pause");?
}
通常當(dāng)我們發(fā)現(xiàn)輸入有錯(cuò)又需要改正的時(shí)候,使用clear()更改標(biāo)記為正確后,同時(shí)也需要使用get()成員函數(shù)清除輸入緩沖區(qū),以達(dá)到重復(fù)輸入的目的。

  示例代碼如下:

#include?<iostream>?
using?namespace?std;?

int?main()??
{?
????????
int?a;?
????????
while(1)?
????????
{?
????????????????cin
>>a;?
????????????????
if(!cin)//條件可改寫為cin.fail()?
????????????????{?
????????????????????????cout
<<"輸入有錯(cuò)!請(qǐng)重新輸入"<<endl;?
????????????????????????cin.clear();?
????????????????????????cin.
get();?
????????????????}
?
????????????????
else?
????????????????
{?
????????????????????????cout
<<a;?
????????????????????????
break;?
????????????????}
?
????????}
?
????????system(
"pause");?
}
  最后再給出一個(gè)對(duì)文件流錯(cuò)誤標(biāo)記處理的例子,鞏固學(xué)習(xí),代碼如下:
#include?<iostream>?
#include?
<fstream>?
using?namespace?std;?

int?main()??
{?
????????ifstream?myfile(
"c:\\1.txt",ios_base::in,0);?
????????
if(myfile.fail())?
????????
{?
????????????????cout
<<"文件讀取失敗或指定文件不存在!"<<endl;?
????????}
?
????????
else?
????????
{?
????????????????
char?ch;?
????????????????
while(myfile.get(ch))?
????????????????
{?
????????????????????????cout
<<ch;?
????????????????}
?
????????????????
if(myfile.eof())?
????????????????
{?
????????????????????????cout
<<"文件內(nèi)容已經(jīng)全部讀完"<<endl;?
????????????????}
?
????????????????
while(myfile.get(ch))?
????????????????
{?
????????????????????????cout
<<ch;?
????????????????}
?
????????}
?
????????system(
"pause");?
}

  未完待續(xù)……

posted on 2006-04-25 22:38 楊粼波 閱讀(495) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 文章收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久另类综合| 欧美成ee人免费视频| 亚洲激情图片小说视频| 久热精品视频在线| 亚洲三级观看| 一区二区免费看| 国产精品一区一区| 久久亚洲国产精品日日av夜夜| 欧美一区二区三区四区在线观看地址| 欧美二区在线看| 欧美顶级艳妇交换群宴| 一区二区三区国产| 午夜欧美精品| 亚洲激情视频在线| 亚洲视频第一页| 永久免费毛片在线播放不卡| 亚洲国产欧美在线人成| 国产精品国产自产拍高清av王其| 亚洲在线一区二区| 久久久欧美精品| 亚洲一区二区三区精品在线| 欧美一级理论性理论a| 亚洲日本成人女熟在线观看| 亚洲综合色婷婷| 亚洲国产专区| 香蕉成人久久| 在线一区二区三区四区五区| 亚洲欧美日韩中文视频| 亚洲精品国久久99热| 亚洲欧美日韩国产综合在线| 亚洲人久久久| 久久精品综合| 亚洲欧美日韩中文在线制服| 麻豆成人精品| 久久三级福利| 国产欧美日韩免费看aⅴ视频| 亚洲高清久久| 99精品久久久| 91久久精品日日躁夜夜躁国产| 亚洲在线观看视频| 亚洲视频在线免费观看| 久久精品国产在热久久 | 久久久亚洲国产美女国产盗摄| 一区二区激情视频| 你懂的视频欧美| 久久这里有精品15一区二区三区| 国产精品成人v| 日韩亚洲成人av在线| 亚洲激情综合| 久久婷婷综合激情| 久久综合九色99| 国产一区99| 欧美一区二区三区在线播放| 亚洲欧美国产一区二区三区| 欧美日韩91| 亚洲精品一级| 99在线精品视频| 欧美精品一卡| 亚洲卡通欧美制服中文| 亚洲精品中文字幕在线| 国内精品久久久久久久影视蜜臀| 亚洲午夜激情| 亚洲永久免费视频| 亚洲中字黄色| 欧美性事在线| 亚洲中无吗在线| 欧美一区二区三区久久精品茉莉花 | 亚洲欧美日韩成人高清在线一区| 欧美精品videossex性护士| 亚洲第一视频| 99国内精品| 国产精品v日韩精品v欧美精品网站| 亚洲精品影院在线观看| 一区二区三区鲁丝不卡| 欧美色欧美亚洲另类七区| 99pao成人国产永久免费视频| 99精品国产一区二区青青牛奶| 欧美精品一区二区三区久久久竹菊 | 亚洲欧美日本视频在线观看| 午夜精品视频一区| 国产一区二区观看| 久久亚洲精品网站| 91久久国产精品91久久性色| 一区二区成人精品| 国产欧美一区二区精品婷婷| 欧美伊人久久大香线蕉综合69| 麻豆精品网站| 一本色道久久精品| 国产精品婷婷午夜在线观看| 久久精品亚洲国产奇米99| 亚洲丁香婷深爱综合| 亚洲视频高清| 黑丝一区二区三区| 欧美精品在线一区| 欧美亚洲一级| 最新日韩av| 久久精品色图| 夜夜嗨av一区二区三区免费区| 亚洲国产免费看| 国产精品护士白丝一区av| 亚洲一区二区3| 麻豆成人精品| 亚洲欧美视频在线| 亚洲国产精品一区二区第四页av| 欧美日韩亚洲激情| 久久久久久久久久久久久久一区| 亚洲高清成人| 久久中文字幕一区二区三区| 宅男噜噜噜66国产日韩在线观看| 国产亚洲欧美日韩日本| 欧美日韩mv| 欧美波霸影院| 欧美一区二区三区四区在线观看| 国产精品videossex久久发布| 欧美在线亚洲一区| 亚洲最新在线| 亚洲国产精品嫩草影院| 久久久国产精品一区二区三区| 一区二区三区高清在线观看| 在线观看一区二区精品视频| 国产精品综合久久久| 欧美日韩不卡视频| 免费亚洲电影在线观看| 午夜综合激情| 亚洲欧美日韩国产另类专区| 9l视频自拍蝌蚪9l视频成人| 国模吧视频一区| 国产精品福利久久久| 欧美成人免费播放| 久久天天躁夜夜躁狠狠躁2022 | 麻豆视频一区二区| 久久精品午夜| 久久久久久久综合狠狠综合| 亚洲综合三区| 亚洲免费一在线| 亚洲一区在线播放| 亚洲麻豆av| 一本色道久久综合亚洲精品按摩| 最近中文字幕日韩精品| 亚洲激情欧美| 亚洲精品乱码久久久久久久久| 亚洲国产精品成人精品| 在线欧美亚洲| 91久久夜色精品国产九色| 91久久精品国产91性色| 午夜精品在线观看| 久久se精品一区精品二区| 性欧美1819sex性高清| 欧美一区二区三区成人 | 欧美大片在线观看一区| 欧美国产一区二区| 亚洲国产精品美女| 日韩视频永久免费| 亚洲一区二区三区四区在线观看 | 美女网站在线免费欧美精品| 美女脱光内衣内裤视频久久网站| 欧美成人免费小视频| 欧美国产日韩一区| 欧美午夜精品久久久久免费视| 欧美性片在线观看| 国产亚洲欧洲997久久综合| 国产小视频国产精品| 最近中文字幕日韩精品| 亚洲午夜一区二区三区| 久久高清免费观看| 欧美成人精品不卡视频在线观看 | 亚洲欧美日韩精品久久亚洲区| 性欧美大战久久久久久久久| 久久婷婷蜜乳一本欲蜜臀| 欧美精品成人一区二区在线观看 | 欧美精选在线| 国产欧美短视频| 亚洲激情在线视频| 性欧美videos另类喷潮| 欧美.www| 亚洲综合第一页| 女同性一区二区三区人了人一 | 久久久久久有精品国产| 欧美日韩mp4| 尤物yw午夜国产精品视频明星| 亚洲作爱视频| 久久在线免费| 一区二区三区**美女毛片| 久久久成人精品| 国产精品成人av性教育| 1000精品久久久久久久久| 亚洲一区二区在线免费观看视频| 久久夜色精品国产欧美乱极品| 亚洲免费电影在线| 久久这里有精品15一区二区三区| 欧美四级在线观看| 亚洲精品国产系列| 鲁大师影院一区二区三区| 一本色道久久99精品综合| 美女图片一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 久久亚洲一区| 国产精品乱人伦一区二区| 亚洲另类在线视频| 老司机精品久久|