程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++的iostream標准庫介紹以及對左移與右移運算符的重載2

C++的iostream標准庫介紹以及對左移與右移運算符的重載2

編輯:C++入門知識
 接下來我們來學習一下輸入/輸出的狀態標志的相關知識,C++中負責的輸入/輸出的系統包括了關於每一個輸入/輸出操作的結果的記錄信息。這些當前的狀態信息被包含在io_state類型的對象中。io_state是一個枚舉類型(就像open_mode一樣),以下便是它包含的值。

goodbit 無錯誤

Eofbit 已到達文件尾

failbit 非致命的輸入/輸出錯誤,可挽回

badbit 致命的輸入/輸出錯誤,無法挽回


  有兩種方法可以獲得輸入/輸出的狀態信息。一種方法是通過調用rdstate()函數,它將返回當前狀態的錯誤標記。例如,假如沒有任何錯誤,則rdstate()會返回goodbit.

下例示例,表示出了rdstate()的用法:

 C++ 代碼
//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

#include <iostream>
using namespace std;

int main()
{
int a;
cin>>a;
cout<<cin.rdstate()< if(cin.rdstate() == ios::goodbit)
{
cout<<"輸入數據的類型正確,無錯誤!"< }
if(cin.rdstate() == ios_base::failbit)
{
cout<<"輸入數據類型錯誤,非致命錯誤,可清除輸入緩沖區挽回!"< }
system("pause");
}



另一種方法則是使用下面任何一個函數來檢測相應的輸入/輸出狀態:

bool bad();

bool eof();

bool fail();

bool good();

下例示例,表示出了上面各成員函數的用法:

 C++ 代碼 //程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

#include <iostream>
using namespace std;

int main()
{
int a;
cin>>a;
cout<<cin.rdstate()< if(cin.good())
{
cout<<"輸入數據的類型正確,無錯誤!"< }
if(cin.fail())
{
cout<<"輸入數據類型錯誤,非致命錯誤,可清除輸入緩沖區挽回!"< }

 如果錯誤發生,那麼流狀態既被標記為錯誤,你必須清除這些錯誤狀態,以使你的程序能正確適當地繼續運行。要清除錯誤狀態,需使用clear()函數。此函數帶一個參數,它是你將要設為當前狀態的標志值。,只要將ios::goodbit作為實參。

示例代碼如下:

 C++ 代碼
//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

#include <iostream>
using namespace std;

int main()
{
int a;
cin>>a;
cout<<cin.rdstate()< cin.clear(ios::goodbit);
cout<<cin.rdstate()< system("pause");
}



  通常當我們發現輸入有錯又需要改正的時候,使用clear()更改標記為正確後,同時也需要使用get()成員函數清除輸入緩沖區,以達到重復輸入的目的。

示例代碼如下:
 C++ 代碼 //程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者
#include <iostream>
using namespace std;

int main()
{
int a;
while(1)
{
cin>>a;
if(!cin)//條件可改寫為cin.fail()
{
cout<<"輸入有錯!請重新輸入"< cin.clear();
cin.get();
}
else
{
cout< break;
}
}
system("pause");
}


最後再給出一個對文件流錯誤標記處理的例子,鞏固學習,代碼如下:

 C++ 代碼 //程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream myfile("c:\1.txt",ios_base::in,0);
if(myfile.fail())
{
cout<<"文件讀取失敗或指定文件不存在!"< }
else
{
char ch;
while(myfile.get(ch))
{
cout< }
if(myfile.eof())
{
cout<<"文件內容已經全部讀完"< }
while(myfile.get(ch))
{
cout< }
}
system("pause");
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved