1. 程式人生 > >緩衝區及流狀態、cin.sync()、cin.clear()、cin.ignore()

緩衝區及流狀態、cin.sync()、cin.clear()、cin.ignore()

1、輸出緩衝區

每一個IO物件都管理一個緩衝區,輸入時先把內容輸入到緩衝區中,當緩衝區被重新整理時將內容寫入到真是的輸出裝置或者檔案,緩衝區被重新整理有以下幾種情況:

1、程式正常結束,作為main函式返回的一部分,將清空所有的緩衝區

2、在一些不確定的情況下緩衝區可能已經滿了,因此在寫下一個值之前會對快取區進行重新整理

3、用操縱符顯示的進行重新整理:

endl:重新整理流,輸出內容換行

flush:重新整理流,但不在輸出中新增任何形式的字元

ends:在緩衝區中插入空字元null並重新整理

4、在每次輸出操作執行完後,用unitbuf操作符設定流的內部狀態,從而清空緩衝區

5、將輸入流與輸出流關聯。

2、流狀態的控制

以下程式碼用於輸出failbit、eofbit、badbit、goodbit幾個標誌的常量值

cout<<"ios::failbit:"<<ios::failbit<<endl;
cout<<"ios::eofbit:"<<ios::eofbit<<endl;
cout<<"ios::badbit:"<<ios::badbit<<endl;
cout<<"ios::goodbit"<<ios::goodbit<<endl;

以下程式碼用於輸出failbit、eofbit、badbit、goodbit幾個標誌當前的狀態,1表示可用,0表示錯誤狀態

cout<<"cin.fail():"<<cin.fail()<<endl;
cout<<"cin.eof():"<<cin.eof()<<endl;
cout<<"cin.bad():"<<cin.bad()<<endl;
cout<<"cin.good:"<<cin.good()<<endl;

3、cin.clear()、cin.sync()、cin.ignore()用法

cin.clear()是將錯誤狀態更改為有效狀態
cin.sync()是清除緩衝區中的未讀資訊
cin.ignore()是忽略緩衝區中指定個數的字元

int v;
char c,d;
while(cin>>v,!cin.eof()){
  if(cin.fail()){
   cerr<<"bad data!"<<endl;
   cout<<"cin.fail():"<<cin.fail()<<endl;
   cin.ignore();       
    c=getchar();
   cout<<"c:"<<c<<endl;
   cin.clear();
   d=getchar();
   cout<<"d:"<<d<<endl;
   cout<<"cin.fail():"<<cin.fail()<<endl;
   }
}

當輸入1 2 3 a 4 5 e時,上述程式cin.ignore()在cin.clear()之前執行,在c=getchar(); cout<<"c:"<<c<<endl;仍然輸出a;表明此時cin.ignore()並沒有執行,否則在用getchar()獲取緩衝區的字串時不會輸出a。此時while迴圈中cin>>獲得的仍然是a,因此程式陷入死迴圈。

int v;
char c,d;
while(cin>>v,!cin.eof()){
  if(cin.fail()){
   cerr<<"bad data!"<<endl;
   cout<<"cin.fail():"<<cin.fail()<<endl;
    c=getchar();
   cout<<"c:"<<c<<endl;
   cin.clear();
  cin.ignore();
   d=getchar();
   cout<<"d:"<<d<<endl;
   cout<<"cin.fail():"<<cin.fail()<<endl;
     }
}

上述程式cin.ignore()在cin.clear()之後執行,執行完cin.ignore後,緩衝區中的字元被捨棄,程式繼續到while迴圈執行。

要特別注意cin.ignore()一定要在cin.clear()之後執行;如果cin為錯誤標誌是不能執行cin.ignore()函式中忽略字元的操作的,必須先用cin.clear()重新將錯誤標誌置為可用,才能執行ignore()中忽略字元的操作,不懂得可以看ignore原始碼。

4、

void main(){
	int data;
	while(cin>>data,!cin.eof()){
		if(cin.bad())
			throw runtime_error("IO stream corrupted");
		if(cin.fail()){
			cerr<<"bad data,try again!"<<endl;
			cin.clear(istream::failbit);
			continue;
		}
	}
}

c++ primer上有一個錯誤程式,對以上程式的改進方法如下

第一種方法(cin.sync();cin.clear())

#include<iostream>
using namespace std;
void main(){
	int data;
	while(cin>>data,!cin.eof()){
		if(cin.bad())
			throw runtime_error("IO stream corrupted");
		if(cin.fail()){
			cerr<<"bad data,try again!"<<endl;
			cin.sync();  
			cin.clear();
			continue;
		}
	}
}

第二種方法(cin.clear();cin.sync())

#include<iostream>
using namespace std;
void main(){
	int data;
	while(cin>>data,!cin.eof()){
		if(cin.bad())
			throw runtime_error("IO stream corrupted");
		if(cin.fail()){
			cerr<<"bad data,try again!"<<endl;
			cin.clear();
			cin.sync();
			continue;
		}
	}
}

第三種方法(cin.clear();cin.ignore());以下用cin.ignore()的地方均可換為cin.sync()

#include<iostream>
using namespace std;
void main(){
	int data;
	while(cin>>data,!cin.eof()){
		if(cin.bad())
			throw runtime_error("IO stream corrupted");
		if(cin.fail()){
			cerr<<"bad data,try again!"<<endl;
			cin.clear();
			cin.ignore();
			continue;
		}
	}
}

第四種方法(cin.clear(istream::goodbit);cin.ignore)

#include<iostream>
using namespace std;
void main(){
	int data;
	while(cin>>data,!cin.eof()){
		if(cin.bad())
			throw runtime_error("IO stream corrupted");
		if(cin.fail()){
			cerr<<"bad data,try again!"<<endl;
			cin.clear(istream::goodbit);
			cin.ignore();
			continue;
		}
	}
}

第五種方法(cin.clear(istream::failbit ^ cin.rdstate());cin.ignore())

#include<iostream>
using namespace std;
void main(){
	int data;
	while(cin>>data,!cin.eof()){
		if(cin.bad())
			throw runtime_error("IO stream corrupted");
		if(cin.fail()){
			cerr<<"bad data,try again!"<<endl;
			cin.clear(istream::failbit ^ cin.rdstate());
			cin.ignore();
			continue;
		}
	}
}

相關推薦

緩衝區狀態cin.sync()cin.clear()cin.ignore()

1、輸出緩衝區 每一個IO物件都管理一個緩衝區,輸入時先把內容輸入到緩衝區中,當緩衝區被重新整理時將內容寫入到真是的輸出裝置或者檔案,緩衝區被重新整理有以下幾種情況: 1、程式正常結束,作為main函式返回的一部分,將清空所有的緩衝區 2、在一些不確定的情況下緩衝區可能已經

cin.clear()cin.sync()

color 不起作用 不變 繼續 學習 沒有 ++ 機器 spa 看機器學習時,發現之前學的C++代碼忘了,cin.clear()、cin.sync() cin.clear():將流中的所有狀態值都重設為有效值 cin.sync():清空流 這個很有意思,如果沒有clear

非同步記憶體直接複製處理複製對比

#include<iostream> #include<cuda.h> #include<cuda_runtime.h> using namespace std; template<const int n> __device_

hadoop格式化節點啟動執行狀態檢視

準備工作: 1. 主機和節點都保證聯網,並service sshd start 啟動ssh服務 2.退出ssh  exit(); 工作: 1. 格式化節點 1.1 進入hadoop安裝目錄 1.2 bin/hadoop namenode -format命令 1.3 jps

C++ IO的概念類庫檔案操作

IO流的概念及流類庫 當程式與外界進行資訊交換時,存在兩個物件,一個是程式中的物件,另一個是檔案物件。 流是資訊流動的一種抽象,它負責在資料的生產者和資料的消費者之間建立聯絡,並管理資料的流動 流物件與檔案操作 程式建立一個流物件

Ubuntu 14.04 標題欄實時顯示上下行網速CPU記憶體狀態

用wget下載indicator-sysmonitor   終端執行wget -c https://launchpad.net/indicator-sysmonitor/trunk/4.0/+download/indicator-sysmonitor_0.4.3_al

座標系變換緩衝區操作矩陣的通用變換函式(openGL)

之前一直糾結於座標系與變換呼叫的順序,但到目前為止: a.使用到的只是一個全域性座標和繪圖座標 b.會呼叫變換就行,無關順序 0.物件的點在出現在螢幕的過程中:各種變換呼叫順序和各種座標系出現順序 物件 \ 建模座標系下,轉化到標準的世界座標系下(方便轉換到眼(視

Ztree _ 橫向顯示子節點點擊文字勾選去除指定元素input的勾選狀態

.cn hid ttr 很好 clas pre ges tree 效果 前些天項目需要樹結構表現數據,需求ztree就能滿足所以直接使用ztree只是踩了些小坑。。。 1.ztree子節點橫向顯示(下圖): 效果說明:第三級子節點按需求橫向顯示其他豎向顯示,每行最多顯示5

(7)javascript的程序控制結構語句------(2)循環控制語句跳轉語句對話框

對話 ima bsp .cn while語句 prompt 彈出 asc div 一、循環控制語句 循環語句主要就是在滿足條件的情況下反復執行某一個操作,循環控制語句主要包括while語句、do...while語句 和for語句。 1、While

IO編程__緩沖字符__應用__記事本的打開保存功能

導入 fin fault == tac form iter npe echo 一、代碼如下 package www.tainiu.wenjian; import java.awt.event.ActionEvent; import java.awt.even

Android掃碼二維碼美女瀑布知乎網易音樂動畫源碼等

代碼 安裝 開發工具 -c dep 更多 應用程序 strip 瀏覽器中 Android精選源碼 QRCode 掃描二維碼、掃描條形碼、相冊獲取圖片後識別、生... 一個簡潔好看的loading彈窗 Android用瀑布流展示美女圖片源碼

js獲取某周某月下月某季度的開始日期結束日期判斷日期第幾周

weekend return n) nth 結束時間 value rst 獲得 set //格式化日期:yyyy-MM-dd   function formatDate(date) {      var myyear = date.getFullYear();     v

04: 用戶授權撤銷 數據備份與恢復 MySQL管理工具

languages ref bash 恢復密碼 option p12 是否 空間 list day04一 、管理root用戶密碼1.1 修改密碼1.2 恢復密碼 二、用戶授權與權限撤銷2.1 授權2.2 撤銷權限 三、安裝圖形管理工具 四 數據備份與恢復 ----- 完全備

第二周第四節特殊權限(set_uidset_gidstick_bit)/軟連接硬連接

2018-03-29特殊權限 文件權限的機制是Linux系統中的一大特色,除了我們現在所熟知的讀(r)、寫(w)、執行(x)權限外,還有三個比較特殊的權限,分別為:setuid、setgid和stick bit(粘滯位)1、setuid與setgid講解:查看系統中常用到它的地方,以/etc/passwd和/

Linux自動掛載鏡像遠程桌面共享win7文件夾創建raid5卷創建HTML文件靜態路由

自動掛載 遠程桌面 共享windows文件夾 raid5卷 靜態路由 Linux自動掛載鏡像、遠程桌面、共享win文件夾、創建raid5卷、創建HTML文件及網絡靜態路由綜合小實驗 環境描述:Linux01和win7分別是公司內網中的兩臺PC機,Linux02是公網上的一臺web服務器根

Nginx代理服務 - 代理緩衝區代理重新定義請求頭代理連線超時

1. 代理緩衝區 代理伺服器可以快取一些響應資料,來減少I/O損耗,資料預設儲存在記憶體中,當記憶體不夠時,會儲存到硬碟上。 proxy_buffering proxy_buffering這個引數用來控制是否開啟後端響應內容的緩衝區,如果這個設定為off,那麼proxy_buffers和

【第8天】Java方法過載方法重寫(覆蓋)構造方法引數傳值

1 方法過載(overload) 2 方法重寫(覆蓋)(override) 3 構造方法 4 引數傳值 1 方法過載(overload) 方法過載的作用? 同時滿足使用者的不同需求。 同一個方法,使用者可以傳入不同

從零開始學微信小程式開發---2小程式專案的建立相關檔案的作用小程式IDE

一、建立一個小程式專案 1、下載安裝微信web開發者工具,目前最新版本是1.02.1811141。 2、開啟,掃碼登入, 3、選擇小程式專案 4、點選專案管理旁邊的+ 5、如果你有小程式賬號會有一個APPID,詳情見小程式簡易教程申請賬號那一節,如果還沒有,可以

【MapReduce詳解原始碼解析(一)】——分片輸入MapperMap端Shuffle過程

title: 【MapReduce詳解及原始碼解析(一)】——分片輸入、Mapper及Map端Shuffle過程 date: 2018-12-03 21:12:42 tags: Hadoop categories: 大資料 toc: true 點選檢視我的部落格:Josonlee’

java8(Stream API)使用詳解:篩選切片對映查詢匹配和歸約等操作

上一篇中介紹了集合操作的痛點並發現集合操作的這些痛點在java8流API面前基本都不是事,隨後引出了流的定義並介紹了流操作的型別、特徵,以及使用流的基本步驟,本篇將逐一介紹Stream Api中各種流操作及一些特殊流的使用。 用謂詞篩選 關於篩選在該系列前面文章中已經出現