在C++語言中,數(shù)據(jù)的輸入和輸出(簡(jiǎn)寫為I/O)包括對(duì)標(biāo)準(zhǔn)輸入設(shè)備鍵盤和標(biāo)準(zhǔn)輸出設(shè)備顯示器、對(duì)在外存磁盤上的文件和對(duì)內(nèi)存中指定的字符串存儲(chǔ)空間(當(dāng)然可用該空間存儲(chǔ)任何信息)進(jìn)行輸入輸出這三個(gè)方面。對(duì)標(biāo)準(zhǔn)輸入設(shè)備和標(biāo)準(zhǔn)輸出設(shè)備的輸入輸出簡(jiǎn)稱為標(biāo)準(zhǔn)I/O,對(duì)在外存磁盤上文件的輸入輸出簡(jiǎn)稱為文件I/O,對(duì)內(nèi)存中指定的字符串存儲(chǔ)空間的輸入輸出簡(jiǎn)稱為串I/O。 輸入輸出格式控制 另外提供一個(gè)新的編寫c/c++程序的方法,因?yàn)樵趘s下面編寫一個(gè)簡(jiǎn)單的小程序,就得生成一大串中間文件,令人十分的不爽 (1),下載utraledit-32編輯器,推薦v11.
1.ios類中的枚舉常量 在根基類ios中定義有三個(gè)用戶需要使用的枚舉類型,由于它們是在公用成員部分定義的,所以其中的每個(gè)枚舉類型常量在加上ios::前綴后都可以為本類成員函數(shù)和所有外部函數(shù)訪問。在三個(gè)枚舉類型中有一個(gè)無名枚舉類型,其中定義的每個(gè)枚舉常量都是用于設(shè)置控制輸入輸出格式的標(biāo)志使用的。該枚舉類型定義如下: enum {skipws, left, right, internal, dec, oct, hex, showbase, showpoint, uppercase, showpos, scientific, fixed, unitbuf, stdio }; 各枚舉常量的含義如下: skipws 利用它設(shè)置對(duì)應(yīng)標(biāo)志后,從流中輸入數(shù)據(jù)時(shí)跳過當(dāng)前位置及后面的所有連續(xù)的空白字符,從第一個(gè)非空白字符起讀數(shù),否則不跳過空白字符??崭?、制表符'/t'、回車符'/r'和換行符'/n'統(tǒng)稱為空白符。缺省為設(shè)置。 left, right, internal left在指定的域?qū)拑?nèi)按左對(duì)齊輸出,right按右對(duì)齊輸出,而internal使數(shù)值的符號(hào)按左對(duì)齊、數(shù)值本身按右對(duì)齊輸出。域?qū)拑?nèi)剩余的字符位置用填充符填充。缺省為right設(shè)置。在任一時(shí)刻只有一種有效。 dec, oct, hex 設(shè)置dec對(duì)應(yīng)標(biāo)志后,使以后的數(shù)值按十進(jìn)制輸出,設(shè)置oct后按八進(jìn)制輸出,而設(shè)置hex后則按十六進(jìn)制輸出。缺省為dec設(shè)置。 showbase 設(shè)置對(duì)應(yīng)標(biāo)志后使數(shù)值輸出的前面加上"基指示符",八進(jìn)制數(shù)的基指示符為數(shù)字0,十六進(jìn)制數(shù)的基指示符為0x,十進(jìn)制數(shù)沒有基指示符。缺省為不設(shè)置,即在數(shù)值輸出的前面不加基指示符。 showpoint 強(qiáng)制輸出的浮點(diǎn)數(shù)中帶有小數(shù)點(diǎn)和小數(shù)尾部的無效數(shù)字0。缺省為不設(shè)置。 uppercase 使輸出的十六進(jìn)制數(shù)和浮點(diǎn)數(shù)中使用的字母為大寫。缺省為不設(shè)置。即輸出的十六進(jìn)制數(shù)和浮點(diǎn)數(shù)中使用的字母為小寫。 showpos 使輸出的正數(shù)前帶有正號(hào)"+"。缺省為不設(shè)置。即輸出的正數(shù)前不帶任何符號(hào)。 scientific, fixed 進(jìn)行scientific設(shè)置后使浮點(diǎn)數(shù)按科學(xué)表示法輸出,進(jìn)行fixed設(shè)置后使浮點(diǎn)數(shù)按定點(diǎn)表示法輸出。只能任設(shè)其一。缺省時(shí)由系統(tǒng)根據(jù)輸出的數(shù)值選用合適的表示輸出。 unitbuf, stdio 這兩個(gè)常量很少使用,所以不予介紹。 在ios中定義的第二個(gè)枚舉類型為: enum open_mode {in, out, ate, app, trunc, nocreate, noreplace, binany}; 其中的每個(gè)枚舉常量規(guī)定一種文件打開的方式,在定義文件流對(duì)象和打開文件時(shí)使用。 在ios中定義的第三個(gè)枚舉類型為: enum seek_dir {beg, cur, end}; 其中的每個(gè)枚舉常量用于對(duì)文件指針的定位操作上。 2. ios類中的成員函數(shù) ios類提供成員函數(shù)對(duì)流的狀態(tài)進(jìn)行檢測(cè)和進(jìn)行輸入輸出格式控制等操作,每個(gè)成員函數(shù)的聲明格式和簡(jiǎn)要說明如下: int bad(); //操作出錯(cuò)時(shí)返回非0值。 int eof(); //讀取到流中最后的文件結(jié)束符時(shí)返回非0值。 int fail(); //操作失敗時(shí)返回非0值。 void clear(); //清除bad,eof和fail所對(duì)應(yīng)的標(biāo)志狀態(tài),使之恢復(fù)為正常狀態(tài) //值0,使good標(biāo)志狀態(tài)恢復(fù)為1。 char fill(); //返回當(dāng)前使用的填充字符。 char fill(char c); //重新設(shè)置流中用于輸出數(shù)據(jù)的填充字符為c的值,返回此 //前的填充字符。系統(tǒng)預(yù)設(shè)置填充字符為空格。 long flags(); //返回當(dāng)前用于I/O控制的格式狀態(tài)字。 long flags(long f); //重新設(shè)置格式狀態(tài)字為f的值,返回此前的格式狀態(tài)字。 int good(); //操作正常時(shí)返回非0值,當(dāng)操作出錯(cuò)、失敗和讀到文件結(jié)束符時(shí) //均為不正常,則返回0。 int precision(); //返回浮點(diǎn)數(shù)輸出精度,即輸出的有效數(shù)字的位數(shù)。 int precision(int n); //設(shè)置浮點(diǎn)數(shù)的輸出精度為n,返回此前的輸出精度。 //系統(tǒng)預(yù)設(shè)置的輸出精度為6,即輸出的浮點(diǎn)數(shù)最多 //具有6位為有效數(shù)字。 int rdstate(); //操作正常時(shí)返回0,否則返回非0值,它與good()正好相反。 long setf(long f); //根據(jù)參數(shù)f設(shè)置相應(yīng)的格式化標(biāo)志,返回此前的設(shè)置。 //該參數(shù)f所對(duì)應(yīng)的實(shí)參為無名枚舉類型中的枚舉常量( //又稱格式化常量),可以同時(shí)使用一個(gè)或多個(gè)常量,每?jī)蓚€(gè) //常量之間要用按位或操作符連接。如當(dāng)需要左對(duì)齊輸出, //并使數(shù)值中的字母大寫時(shí),則調(diào)用該函數(shù)的實(shí)參為ios:: //left | ios::uppercase。 long unsetf(long f); //根據(jù)參數(shù)f清除相應(yīng)的格式化標(biāo)志,返回此前的設(shè)置。 //如要清除此前的左對(duì)齊輸出設(shè)置,恢復(fù)缺省的右對(duì)齊輸出 //設(shè)置,則調(diào)用該函數(shù)的實(shí)參為ios::left。 int width(); //返回當(dāng)前的輸出域?qū)?。若返回?cái)?shù)值0則表明沒有為剛才輸出的 //數(shù)值設(shè)置輸出域?qū)挘敵鲇驅(qū)捠侵篙敵龅闹翟诹髦兴加械淖止?jié)數(shù)。 int width(int w); //設(shè)置下一個(gè)數(shù)據(jù)值的輸出域?qū)挒閣,返回為輸出上一個(gè)數(shù) //據(jù)值所規(guī)定的域?qū)?,若無規(guī)定則返回0。注意:此設(shè)置不 //是一直有效,而只是對(duì)下一個(gè)輸出數(shù)據(jù)有效。 因?yàn)樗蠭/O流類都是ios的派生類,所以它們的對(duì)象都可以調(diào)用ios類中的成員函數(shù)和使用ios類中的格式化常量進(jìn)行輸入輸出格式控制。下面以標(biāo)準(zhǔn)輸出流對(duì)象cout為例說明輸出的格式化控制。 程序1: #include<iostream.h> void main() { int x=30, y=300, z=1024; cout<<x<<' '<<y<<' '<<z<<endl; //按十進(jìn)制輸出 cout.setf(ios::oct); //設(shè)置為八進(jìn)制輸出 cout<<x<<' '<<y<<' '<<z<<endl; //按八進(jìn)制輸出 cout.unsetf(ios::oct); //取消八進(jìn)制輸出設(shè)置,恢復(fù)按十進(jìn)制輸出 cout.setf(ios::hex); //設(shè)置為十六進(jìn)制輸出 cout<<x<<' '<<y<<' '<<z<<endl; //按十六進(jìn)制輸出 cout.setf(ios::showbase | ios::uppercase); //設(shè)置基指示符輸出和數(shù)值中的字母大寫輸出 cout<<x<<' '<<y<<' '<<z<<endl; cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符輸出和數(shù)值中的字母大寫輸出 cout<<x<<' '<<y<<' '<<z<<endl; cout.unsetf(ios::hex); //取消十六進(jìn)制輸出設(shè)置,恢復(fù)按十進(jìn)制輸出 cout<<x<<' '<<y<<' '<<z<<endl; } 此程序的運(yùn)行結(jié)果如下: 30 300 1024 36 454 2000 1e 12c 400 0X1E 0X12C 0X400 1e 12c 400 30 300 1024 程序2: #include<iostream.h> void main() { int x=468; double y=-3.425648; cout<<"x="; cout.width(10); //設(shè)置輸出下一個(gè)數(shù)據(jù)的域?qū)挒?0 cout<<x; //按缺省的右對(duì)齊輸出,剩余位置填充空格字符 cout<<"y="; cout.width(10); //設(shè)置輸出下一個(gè)數(shù)據(jù)的域?qū)挒?0 cout<<y<<endl; cout.setf(ios::left); //設(shè)置按左對(duì)齊輸出 cout<<"x="; cout.width(10); cout<<x; cout<<"y="; cout.width(10); cout<<y<<endl; cout.fill('*'); //設(shè)置填充字符為'*' cout.precision(3); //設(shè)置浮點(diǎn)數(shù)輸出精度為3 cout.setf(ios::showpos); //設(shè)置正數(shù)的正號(hào)輸出 cout<<"x="; cout.width(10); cout<<x; cout<<"y="; cout.width(10); cout<<y<<endl; } 此程序運(yùn)行結(jié)果如下: x= 468y= -3.42565 x=468 y=-3.42565 x=+468******y=-3.43***** 程序3: #include<iostream.h> void main() { float x=25, y=-4.762; cout<<x<<' '<<y<<endl; cout.setf(ios::showpoint); //強(qiáng)制顯示小數(shù)點(diǎn)和無效0 cout<<x<<' '<<y<<endl; cout.unsetf(ios::showpoint); //恢復(fù)缺省輸出 cout.setf(ios::scientific); //設(shè)置按科學(xué)表示法輸出 cout<<x<<' '<<y<<endl; cout.setf(ios::fixed); //設(shè)置按定點(diǎn)表示法輸出 cout<<x<<' '<<y<<endl; } 程序運(yùn)行結(jié)果如下: 25 -4.762 25.0000 -4.76200 2.500000e+001 -4.762000e+000 25 -4.762 3. 格式控制操作符 數(shù)據(jù)輸入輸出的格式控制還有更簡(jiǎn)便的形式,就是使用系統(tǒng)頭文件iomanip.h中提供的操縱符。使用這些操縱符不需要調(diào)用成員函數(shù),只要把它們作為插入操作符<<(個(gè)別作為提取操作符>>)的輸出對(duì)象即可。這些操縱符及功能如下: dec //轉(zhuǎn)換為按十進(jìn)制輸出整數(shù),它也是系統(tǒng)預(yù)置的進(jìn)制。 oct //轉(zhuǎn)換為按八進(jìn)制輸出整數(shù)。 hex //轉(zhuǎn)換為按十六進(jìn)制輸出整數(shù)。 ws //從輸入流中讀取空白字符。 endl //輸出換行符'/n'并刷新流。刷新流是指把流緩沖區(qū)的內(nèi)容立即寫入到對(duì) //應(yīng)的物理設(shè)備上。 ends //輸出一個(gè)空字符'/0'。 flush //只刷新一個(gè)輸出流。 setiosflags(long f) //設(shè)置f所對(duì)應(yīng)的格式化標(biāo)志,功能與setf(long f) //成員函數(shù)相同,當(dāng)然輸出該操縱符后返回的是一個(gè) //輸出流。如采用標(biāo)準(zhǔn)輸出流cout輸出它時(shí),則返回 //cout。對(duì)于輸出每個(gè)操縱符后也都是如此,即返回 //輸出它的流,以便向流中繼續(xù)插入下一個(gè)數(shù)據(jù)。 resetiosflags(long f) //清除f所對(duì)應(yīng)的格式化標(biāo)志,功能與unsetf(long f) //成員函數(shù)相同。當(dāng)然輸出后返回一個(gè)流。 setfill(int c) //設(shè)置填充字符為ASCII碼為c的字符。 setprecision(int n) //設(shè)置浮點(diǎn)數(shù)的輸出精度為n。 setw(int w) //設(shè)置下一個(gè)數(shù)據(jù)的輸出域?qū)挒閣。 在上面的操縱符中,dec, oce, hex, endl, ends, flush和ws除了在iomanip.h中有定義外,在iostream.h中也有定義。所以當(dāng)程序或編譯單元中只需要使用這些不帶參數(shù)的操縱符時(shí),可以只包含iostream.h文件,而不需要包含iomanip.h文件。 下面以標(biāo)準(zhǔn)輸出流對(duì)象cout為例,說明使用操作符進(jìn)行的輸出格式化控制。 程序4: #include<iostream.h> //因iomanip.h中包含有iostream.h,所以該命令可省略 #include<iomanip.h> void main() { int x=30, y=300, z=1024; cout<<x<<' '<<y<<' '<<z<<endl; //按十進(jìn)制輸出 cout<<oct<<x<<' '<<y<<' '<<z<<endl; //按八進(jìn)制輸出 cout<<hex<<x<<' '<<y<<' '<<z<<endl; //按十六進(jìn)制輸出 cout<<setiosflags(ios::showbase | ios::uppercase); //設(shè)置基指示符和數(shù)值中的字母大寫輸出 cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六進(jìn)制輸出 cout<<resetiosflags(ios::showbase | ios::uppercase); //取消基指示符和數(shù)值中的字母大寫輸出 cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六進(jìn)制輸出 cout<<dec<<x<<' '<<y<<' '<<z<<endl; //按十進(jìn)制輸出 } 此程序的功能和運(yùn)行結(jié)果都與程序1完全相同。 程序5: #include<iostream.h> #include<iomanip.h> void main() { int x=468; double y=-3.425648; cout<<"x="<<setw(10)<<x; cout<<"y="<<setw(10)<<y<<endl; cout<<setiosflags(ios::left); //設(shè)置按左對(duì)齊輸出 cout<<"x="<<setw(10)<<x; cout<<"y="<<setw(10)<<y<<endl; cout<<setfill('*'); //設(shè)置填充字符為'*' cout<<setprecision(3); //設(shè)置浮點(diǎn)數(shù)輸出精度為3 cout<<setiosflags(ios::showpos); //設(shè)置正數(shù)的正號(hào)輸出 cout<<"x="<<setw(10)<<x; cout<<"y="<<setw(10)<<y<<endl; cout<<resetiosflags(ios::left | ios::showpos); cout<<setfill(' '); } 此程序的功能和運(yùn)行結(jié)果完全與程序2相同。 程序6: #include<iomanip.h> void main() { float x=25, y=-4.762; cout<<x<<' '<<y<<endl; cout<<setiosflags(ios::showpoint); cout<<x<<' '<<y<<endl; cout<<resetiosflags(ios::showpoint); cout<<setiosflags(ios::scientific); cout<<x<<' '<<y<<endl; cout<<setiosflags(ios::fixed); cout<<x<<' '<<y<<endl; } 此程序的功能和運(yùn)行結(jié)果也完全與程序3相同。 |
|