http://www.cnblogs.com/keam37/ keam所有 轉載請注明出處
本文將分別從<iostream>,<sstream>,<fstream>,<iomanip>4個頭文件介紹包含在其中的函數的用法.
#inclde<iostream>
cin,cout,cerr是最基本的輸入輸出流 ,通過運算符"<<"和 “>>”操作
例如從鍵盤讀入兩個字符串,再將其合並輸出
string s1,s2; cin>>s1>>s2; cout<<s1+' '+s2; if(!cin) cerr<<"input error";
運行輸入為 :
Hello
keambar
則會輸出:
Hello keambar
如果直接輸入文件結束符 ctrl+z
則會輸出 “input error”
這裡與if(!cin) 有關的是操縱流的條件狀態
有以下幾種狀態(flag)
badbit 代表流已經崩潰
failbit 表示一個IO操作失敗
eofbif 表示流到達文件結束
goodbit 值為0, 表示沒有錯誤
定義 istream s;//s是一個輸入流
s.bad() 對應badbit,如果badbit置位,返回true;
s.eof() 對應eofbit狀態,如上;
s.fai() 對應failbit,如上;
s.good() 對應goodbit,如上;
s.clear() 復位所有錯誤狀態,如果加上參數如s.clear(failbit)則僅復位failbit;
s.setstate(flag) 將流s的狀態復位為給定狀態;
s.rdstate() 返回當前s流的狀態,返回值為 flag;
下面的例子來自C++primer:
auto old_state = cin.rdstate(); //記住cin的當前狀態 cin.clear(); //使cin有效 process_input (cin); //使用cin cin.setstate (old_state) ; //將cin置為原狀態
如果程序崩潰,輸出緩沖區將不會刷新,可能導致不會輸出程序執行結果.
刷新輸出緩沖區的方法
cout<<”hi”<<endl; 輸出字符串加上換行,然後刷新;
cout<<”hi”<<flush;輸出字符串,然後刷新;
cout<<”hi”<<ends;輸出字符串加上一個空字符,然後刷新;
unitbuf 操作符
cout<<unitbuf //所有輸出操作後都會立即刷新;
cout<<nounitbuf //取消上述操作
關聯輸入和輸出流
默認情況下 cin和cerr 都關聯到cout,因此讀cin或寫cerr 都會刷新cout;
x.tie(&O) 將x關聯到輸出流O;
x.tie() 返回x當前關聯的輸出流指針,若沒有關聯到輸出流則返回空指針;
其他操作
cout.put(char ch) //將字符ch加入輸出流
cin.putback(char ch) //將字符ch加入輸入流;
cin.get(char *s,streamsize num,char delim)//從cin流讀入字符串,從字符串的首指針,長度為num,或讀到 delim結束,第三個參數可不帶
getline(cin,string s,char delim) //從cin流讀入一行,放入字符串中,遇到行結束或讀到delim結束,默認delim=‘\n’
cin.ignore( streamsize num=1, int delim ); //從cin流讀入數,長度為num,或讀到delim結束,默認為換行;
//在使用get後可以使用 cin.gcount( )返回 已經讀入的字符數
例如
char c[10]; cin.get ( &c[0], 9 ); cout << c << endl; cout << cin.gcount( ) << endl;
/*==============================/*
#include<sstream>
stringstream s;//定義一個字符串流s
stringstream s(“keambar”);//定義一個已近寫入”keambar”的字符串流;
s>> 從字符串s讀入數據
s<<將字符寫入s;
sstream操作雖然簡單,但十分實用,具體用法和方便之處自行體會 :)
<iostream>大部分輸入輸出操作都可以對stringstream使用
/*==============================/*
#inclde<fstream>
ifstream read("in.txt"); //打開文件in.txt
ofstream write("out.txt");//打開文件out.txt 若無則將創建
read>> //從文件讀入
cout<< //輸出到文件
read.close();// 關閉與read綁定的文件;
read.open("in2.txt");//重新將read與in2.txt綁定;
read.is_open()//返回bool值,指出與s綁定的文件是否已近打開;
文件模式(mod)s.open(文件名,mod)
in 以讀方式打開
out 以寫方式打開
app 每次寫操作定位到文件末尾
ate 打開後定位到文件末尾
trunc 截斷文件
binary 以二進制方式打開
默認使用oftream 以out方式打開,並且截斷文件,要保留原內容需要用app模式
下面內容來自文檔 seekg()/seekp()與tellg()/tellp()的用法詳解
seekg()/seekp()與tellg()/tellp()的用法詳解
對輸入流操作:seekg()與tellg()
對輸出流操作:seekp()與tellp()
下面以輸入流函數為例介紹用法:
seekg()是對輸入文件定位,它有兩個參數:第一個參數是偏移量,第二個參數是基地址。
對於第一個參數,可以是正負數值,正的表示向後偏移,負的表示向前偏移。
而第二個參數可以是:
ios::beg:表示輸入流的開始位置
ios::cur:表示輸入流的當前位置
ios::end:表示輸入流的結束位置
tellg()函數不需要帶參數,它返回當前定位指針的位置,也代表著輸入流的大小。
其他操作
peek() //peek函數用於讀取並返回下一個字符,但並不提取該字符到輸入流中,也就是說,依然讓該字符作為將要提取到輸入流的下一個字符。
例如下面來自 http://www.cplusplus.com/reference/istream/istream/peek/的例程
// istream::peek example #include <iostream> // std::cin, std::cout #include <string> // std::string int main () { std::cout << "Please, enter a number or a word: "; char c = std::cin.peek(); if ( (c >= '0') && (c <= '9') ) { int n; std::cin >> n; std::cout << "You entered the number: " << n << '\n'; 15 } else { std::string str; std::getline (std::cin, str); std::cout << "You entered the word: " << str << '\n'; } return 0; }
cin.read(char* buffer, streamsize num ) //按字節讀入
cin.write(const char* buffer, streamsize num )//按字節輸出
例如
struct { int height; int width; } rectangle; input_file.read ( (char *) (&rectangle), sizeof (rectangle) ); if ( input_file.bad() ) { cerr << "Error reading data" << endl; exit ( 0 ); }
/*==============================/*
#inclde<iomanip>
涉及到格式化輸出,不僅僅使用<iomanip>頭文件,也將包含<iostream>
<iostream>中有
cout.fill(char ch) // 將填充字符設置為 ch
cout.fill() //返回當前填充字符
cout.width(int k) //將輸出寬度設置為k,設置僅對下次輸出有效
例如
cout << 32 << endl; cout.width (5); cout << 32 << endl; cout << 32 << endl; cout.fill ('#'); cout.width (5); cout << 32 << endl; cout << cout.fill() << endl;
將輸出
32
32
32
###32
#
cout.flags() //返回int值,表示當前格式
cout.precision(int k) //保留k位有效數字,不加參數返回int值,表示當前設置
cout.setf(ios:: ) //開啟格式 flag
ios格式
boolalpha //按bool值輸出"true" 或 "false".
dec //以10進制輸出.
hex //以16進制表示整數.
oct //以8進制表示整數
fixed //將符點數按照普通定點格式處理(非科學計數法)
internal //在符號位和數值的中間插入需要數量的填充字符以使串兩端對齊
left //在串的末尾插入填充字符以使串居左對齊
right //在串的前面插入填充字符以使串居右對齊
scientific // 將符點數按照科學計數法處理(帶指數域)
showbase //為整數添加一個表示其進制的前綴
showpoint //在浮點數表示的小數中強制插入小數點(默認情況是浮點數表示的整數不顯示小數點)
showpos //強制在正數前添加+號
skipws //忽略前導的空格
unitbuf //前面已近介紹過,在插入(每次輸出)操作後清空緩存
uppercase //強制大寫字母
下面來自http://www.cnblogs.com/devymex/archive/2010/09/06/1818754.html
更多操作也可參考其中
以上每一種格式都占用獨立的一位,因此可以用“|”(位或)運算符組合使用。調用setf/unsetf或flags設置格式一般按如下方式進行:
cout.setf(ios::right | ios::hex);
//設置16進制右對齊
cout.setf(ios::right, ios::adjustfield);
//取消其它對齊,設置為右對齊
setf可接受一個或兩個參數,一個參數的版本為設置指定的格式,兩個參數的版本中,後一個參數指定了刪除的格式。三個已定義的組合格式為:
- ios::adjustfield 對齊格式的組合位
- ios::basefield 進制的組合位
- ios::floatfield 浮點表示方式的組合位
另外
cout.flag的操作有如下用法
int number = 32; cout.setf (ios::showbase); //設置為顯示進制前綴 //setw()函數在<iomanip>中,包括直接使用<<hex cout << setw (6) << hex << 32 << setw (6) << oct << 32 << endl; cout << number << endl;//此時輸出按照最近一次輸出的格式輸出 auto p = cout.flags();//用p記錄當期的格式 cout.unsetf(ios::oct);//取消8進制輸出 cout << number << endl; cout.flags (p); //設置為格式p cout << number << endl; return 0;
輸出為
0x20 040
040
32
040
參考資料 c++ primer,c++ Reference