1. 程式人生 > >MOOC C++筆記(七)輸入輸出流

MOOC C++筆記(七)輸入輸出流

輸入輸出流

與輸入輸出流操作相關的類


istream:是用於輸入的流類,cin就是該類的物件。
ostream:是用於輸出的流類,cout就是該類的物件。
ifstream:是用於從檔案讀取資料的類。
ofstream:是用與向檔案寫入資料的類。
iostream:是既能用於輸入,又能用於輸出的類。
fstream:是既能從檔案讀取資料,又能向檔案寫入資料的類。

標準流物件

輸入流物件:cin 與標準輸入裝置相連
輸出流物件:cout 與標準輸出裝置相連
cerr 與標準錯誤輸出裝置相連
clog 與標準錯誤輸出裝置相連
預設情況下
cerr<<"hello,world"<<endl

clog<<"hello,world"<<endl
cout<<"hello,world"<<endl一樣
cin對應於標準輸入流,用於從鍵盤讀取資料,也可以被重定向為從檔案中讀取資料。
cout對應於標準輸出流,用於向螢幕輸出資料,也可以被重定向為向檔案寫入資料。
cerr對應於標準錯誤輸出流,用於向螢幕輸出出錯資訊。
clog對應於標準錯誤輸出流,用於向螢幕輸出出錯資訊。
cerr和clog的區別在於cerr不適用緩衝區,直接向顯示器輸出資訊;而輸出到clog中的資訊先會被存放在緩衝區,緩衝區滿或者重新整理時才輸出到螢幕。

重定向

freopen函式可以用於輸入輸出重定向

#include<iostream>  
using namespace std;
int main(){
    int x,y;
    cin>>x>>y;
    freopen("test.txt","w",stdout);//將標準輸出重定向到test.txt檔案  
    if(y==0)
        cerr<<"error"<<endl;
    else
        cout<<x/y;
    return 0;
}
#include<iostream>  
using namespace std;
int main(){
    double f;
    int n;
    freopen("test.txt","r",stdout);//cin被改為從t.txt中讀取資料  
    cin>>f>>n;
    return 0;
}

判斷輸入流結束

可以用如下方法判斷輸入流結束:
while(cin>>x){}
如果是從檔案輸入,讀到檔案尾部,輸入流就算結束。
如果從鍵盤輸入,則在單獨一行輸入Ctrl+Z代表輸入流結束。

istream類的成員函式

getline函式

istream&getline(char *buf,int bufSize);
從輸入流中讀取bufSize-1個字元到緩衝區buf,或讀到碰到'\n'為止(哪個先到算哪個)。
istream&getline(char *buf,int bufSize,char delim)
從輸入流中讀取bufSize-1個字元到緩衝區buf,或讀到碰到delim字元為止(哪個先到算哪個)。
兩個函式都會自動在buf中讀入資料的結尾新增'\0'。'\n'或delim都不會被讀入buf,但會被從輸入流中取走。如果輸入流中'\n'或delim之前的字元個數達到或超過了buf'Size個,就導致讀入出錯,其結果就是:雖然本次讀入已經完成,但是之後的讀入就都會失敗了。
可以用if(!cin.getline(...))判斷輸入是否結束。

eof函式

bool eof()
判斷輸入流是否結束

peek函式

int peek()
返回下一個字元,但不從流中去掉。

putback函式

istream &putback(char c)
將字元ch放回輸入流

ignore函式

istream&ignore(int nCount=1,int delim=EOF);
從流中刪掉最多nCount個字元,遇到EOF時結束。

流操縱運算元(格式化輸出)

整數流的基數:流操縱運算元dec,oct,hex,setbase
浮點數的精度(precision,setprecision)
設定域寬(setw,width)
使用者自定義的流操縱運算元
使用流操縱運算元
注意:使用流操縱運算元需要#include<iomanip>

控制整數流的基數的流操縱運算元

流操縱運算元dec,oct,hex

int n=10;  
cout<<n<<endl;  
cout<<hex<<n<<"\n"//十六進位制輸出  
       <<dec<<n<<"\n"//十進位制輸出
       <<oct<<n<<endl;//八進位制輸出

輸出結果:
10
a
10
12

控制浮點數精度的流操縱運算元

precision,setprecision
precision是成員函式,呼叫方式為:cout.precision(5)
setprecision是流操縱運算元,其呼叫方式為: cout<<setprecision(5);//可以連續輸出
它們的功能相同。
指定輸出浮點數的有效位數(非定點方式輸出時)
指定輸出浮點數的小數點後的有效位數(定點方式輸出時)
定點方式:小數點必須出現在個位數後面(非定點方式一般指科學計數法)
設定定點輸出的方式cout<<setiosflags(ios::fixed)<<setprecision(6)<<x<<endl;
setiosflags(ios::fixed)表示以小數點位置固定的方式輸出,或者使用fixed運算元。
resetiosflags(ios::fixed)表示取消以小數點位置固定的方式輸出。

設定域寬的流操縱運算元

設定域寬(setw,width)
setw為運算元,width是成員函式

int w=4;
char string[10];
cin.width(w);
cin>>string;
cout<<setw(5)<<endl;  

輸入:1234
輸出:  123
注意:cin在讀入字串的時候會預留一個地方給'\0',所以實際只讀了三個字元。
寬度設定有效性是一次性的,在每次讀入和輸出之前都要設定寬度。

其他運算元

showpos非負數要顯示正號。
noshowpos非負數不顯示正號。
fixed表示以定點方式輸出。
scientific表示以科學計數法輸出。
setfill(ch)表示寬度不足時以ch字元填充空白。
left表示如果寬度不夠左對齊。
right表示右對齊。
internal表示寬度不足時,符號和數值分列左右,中間填充字元填充

使用者自定義流操縱運算元

ostream&tab(ostream &output){
    return output<<'\t';
}
cout<<"aa"<<tab<<"bb"<<endl;

輸出:aa    bb
之所以允許使用者這樣自定義流操縱運算元,是因為iostream裡對<<進行了過載(成員函式)

ostream &operator
<<(ostream &(*p)(ostream &));

該函式內部會呼叫p所指向的函式,且以*this作為引數hex、dec、oct都是函式