標籤:
- iostream分為輸入輸出資料流,即istream和ostream,其針對控制視窗的輸入輸出;常見的輸入輸出函數有cin cout cerror;
- fstream主要是來解決檔案操作流,也是iostream的衍生類(包含輸入輸出),我們知道的有ifstream和ofstream;
- sstream主要是來解決c風格的字串操作流,也是iostream的衍生類(包含輸入輸出),我們知道的有istrstream和ostrstream;如果想解決c++字串的流,就要使用stringstream;
以下用存取檔案的例子來說明ifstream和ofstream:
void write_file(){ ofstream myfile("c:\\1.txt", ios::app, _SH_DENYNO); if (myfile.fail()) { cout << "檔案開啟失敗"; myfile.open("c:\\1.txt", ios::out | ios::trunc, _SH_DENYNO); } myfile << "中國軟體開發實驗室" << endl << "網址:" << "www.cndev- lab.com" << endl; myfile.close();}void read_file(){ ifstream myfile("c:\\1.txt", ios::out, _SH_DENYNO); char ch; string content; while (myfile.get(ch)) { content += ch; } cout << content << endl; myfile.close();}/** * iostream整合輸入輸出 */void read_write(const string &in_path,const string &out_path){ ifstream in_file(in_path, ios::out, _SH_DENYWR); char cc; string content; while (in_file.get(cc)) { content += cc; } ofstream out_file(out_path, ios::out, _SH_DENYWR); out_file << content << endl; out_file.close(); in_file.close();}
ifstream和ofstream解決了從流到char *的轉換,代碼如下:
using namespace std;void read_str(){ char *name = "www.cndev-lab.com"; istrstream is(name, strlen(name) + 1); char read; while (is.get(read)) { cout << read; } cout << endl;}void write_str(){ int arraysize = 1; char *pbuffer = new char[arraysize]; ostrstream ostr(pbuffer, arraysize, ios::out); ostr << arraysize << ends;//使用ostrstream輸出到流對象的時候,要用ends結束字串 cout << pbuffer; delete[] pbuffer;}/** * stringstream解決類型轉換 */void test_stringstream(){ stringstream ost("hello world"); ost.put(‘\n‘); ost << "OK"; cout << ost.str() << endl; //stringstream sstr; //--------int轉string----------- //int a = 100; string str; //sstr << a; //sstr >> str; //cout << str << endl; //--------string轉char[]-------- //sstr.clear(); ////如果你想通過使用同一stringstream對象實現多種類型的轉換, ////請注意在每一次轉換之後都必須調用clear() 成員函數。 //string name = "colinguan"; //char cname[200]; //sstr << name; //sstr >> cname; //cout << cname;}
對於檔案的開啟 傳輸狀態 ,c++定義了如下兩種方式第一種,通過狀態值判斷
- goodbit 無錯誤
- Eofbit 已到達檔案尾
- failbit 非致命的輸入/輸出錯誤,可挽回
- badbit 致命的輸入/輸出錯誤,無法挽回
/** * 通過狀態修改 */void stream_state(){ int a=0; cin >> a; cout << cin.rdstate() << endl; if (cin.rdstate() == ios::goodbit) { cout << "輸入資料的類型正確,無錯誤!" << endl; } if (cin.rdstate() == ios_base::failbit) { cout << "輸入資料類型錯誤,非致命錯誤,可清除輸入緩衝區挽回!" << endl; }}
第二種,通過方法判斷
bool bad(); bool eof();
bool fail(); bool good();
void stream_state_method(){ /* int a=0; cin >> a; cout << cin.rdstate() << endl; cin.clear(ios::goodbit); cout << cin.rdstate() << endl; */ int a=0; while (1) { cin >> a; if (cin.fail()){ cout<<"輸入有錯!請重新輸入"<<endl; cin.clear(); cin.get(); } else{ cout<<a; break; } }}
參考檔案:http://www.cppblog.com/yuqilin1228/archive/2010/03/26/110620.html
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
C++ iostream標準庫