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

輸入輸出流

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

TIM截圖20191030205008.png
istream:是用於輸入的流類,cin就是該類的對象。
ostream:是用於輸出的流類,cout就是該類的對象。
ifstream:是用於從文件讀取數據的類。
ofstream:是用與向文件寫入數據的類。
iostream:是既能用於輸入,又能用於輸出的類。
fstream:是既能從文件讀取數據,又能向文件寫入數據的類。

標準流對象

輸入流對象:cin 與標準輸入設備相連
輸出流對象:cout 與標準輸出設備相連
cerr 與標準錯誤輸出設備相連
clog 與標準錯誤輸出設備相連
缺省情況下
cerr<<"hello,world"<<endlclog<<"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都是函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章