1. 程式人生 > 其它 >標準輸入輸出

標準輸入輸出

標準輸入輸出

標準輸入輸出流

  • cin 標準輸入

  • cout 標準輸出

  • cerr 標註錯誤

  • 流的四種狀態

goodbit 有效狀態,只有流有效時,才能正常使用
badbit  表示系統級別的錯誤
eofbit  表示到達了流的末尾
fialbit 表示發生了錯誤
bool bad() const; //若流的badbit置位,則返回true;否則返回false bool fail() const; //若流的failbit或badbit置位,則返回true;
bool eof() const; //若流的eofbit置位,則返回true;
bool good() const; //若流處於有效狀態,則返回true;
extern istream cin;     /// Linked to standard input
 extern ostream cout; /// Linked to standard output
 extern ostream cerr; /// Linked to standard error (unbuffered)
 extern ostream clog; /// Linked to standard error (buffered)
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
void test0(){
int number=-1;
cout<<"cin.good():"<<cin.good()<<endl;
cout<<"cin.bad():"<<cin.bad()<<endl;
cout<<"cin.eof():"<<cin.eof()<<endl;
cout<<"cin.fail():"<<cin.fail()<<endl;
//假設從cin裡面獲取資料
cin>>number;//這裡箭頭符號的方向表示箭頭的流向
cout<<"cin.good():"<<cin.good()<<endl;
cout<<"cin.bad():"<<cin.bad()<<endl;
cout<<"cin.eof():"<<cin.eof()<<endl;
cout<<"cin.fail():"<<cin.fail()<<endl;
cout<<number<<endl;
}
int main(){
test0();
return 0;
}
結果:
.jing@jing:~/code/2022-4-1$ ./stream
cin.good():1
cin.bad():0
cin.eof():0
cin.fail():0
abc    //這個地方非法輸入了,導致結果出現偏差,下面會增加一個fail
cin.good():0
cin.bad():0
cin.eof():0
cin.fail():1
0

在使用流的過程中要時刻注意流的狀態,防止發生流失效的情況。

  • 原始碼裡面是用列舉表示的

 

重置流的狀態

1、呼叫clear方法,進行重置
//clear的無參版本會復位所有錯誤標誌位*(重置流的狀態)
void clear(std::ios_base::iostate state = std::ios_base::goodbit);
2、清空緩衝區
//讀取到前count個字元或在讀這count個字元程序中遇到delim字元就停止,並把讀取的這些東西丟掉
istream & ignore(std::streamsize count = 1, int_type delim = Traits::eof());
void test1(){
int number=-1;
//通過終端獲取一個整形資料
while(cin>>number,!cin.eof())//表示沒有讀到流的末尾的時候
{
if(cin.bad()){
cout<<"cin had broken!"<<endl;//表示錯誤
return ;
}else if(cin.fail()){
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');\
               //ignore的使用
cout<<"pls input a valid integer:"<<endl;;
}else{
cout<<"number:"<<number<<endl;
}
}

緩衝區

/*
此緩衝區就是一塊記憶體區,它用在輸入輸出裝置和CPU之間,用來快取資料。它使得低速的輸入輸出裝置和高速的CPU能夠協調工作,避免低速的輸入輸出裝置佔用CPU,解放出CPU,使其能夠高效率工作。
*/

緩衝區分為三種類型:全緩衝、行緩衝和不帶緩衝。

  • 全緩衝:在這種情況下,當填滿標準I/O快取後才進行實際I/O操作。全緩衝的典型代表是對磁碟檔案的讀寫。

  • 行緩衝:在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的I/O操作。這時,我們輸入的字元先存放在緩衝區,等按下回車鍵換行時才進行實際的I/O操作。典型代表是鍵盤輸入資料。

  • 不帶緩衝:也就是不進行緩衝,標準出錯情況cerr/stderr是典型代表,這使得出錯資訊可以直接儘快地顯示出來

//當位元組數大於1024個位元組時,通過cout輸出的資料會立刻顯示在終端上,不需要再等待三秒
void test0(){
   for(int i=0;i<1025;i++){
       cout<<'a';
  }
   sleep(3);
}