c++? I/O(不包括文件)
http://www.cnblogs.com/chinazhangjie/archive/2010/08/19/1803057.html
C++支持兩種I/O,1、C語言繼承而來 2、有C++定義的面向?qū)ο驣/O系統(tǒng)。
1、int getchar(void);,返回一個整數(shù)值,也可以指定這個值為char變量,行緩沖輸入(回車鍵結(jié)束)。如果有錯,返回EOF。
2、int putchar(int c);? 輸出低位字節(jié),放回被寫入的字符,失敗則返回EOF,
3、int getch(void);
?? int getche(void);
4、char* gets(char* str);遇到回車鍵結(jié)束,不包含回車鍵,空結(jié)束符放在串尾。注意:沒有邊界檢查,有可能 數(shù)組越界
5、int puts(const char* str);只針對字符串打印到屏幕上,相對于printf的開銷小,空間少,速度快不能輸出數(shù)字或者是格式轉(zhuǎn)換。操作失敗返回EOF,否則返回非負值。
6、int printf(const char* control_string,...);
(控制串)有兩種類型項目組成第一類由將打印在屏幕上的字符串組成,第二類包括自定義其后變元顯示方式的格式限定符。格式限定符以一個百分號開頭,后跟格式化碼,變元列表中的變元數(shù)與格式限定符完全相等,格式限定符與變元按順序從左到右匹配。
7、int scanf(const char* control_string...);
可以讀入各種內(nèi)嵌類型并自動將其轉(zhuǎn)換為適當?shù)母袷?。返回成功的賦予了一個值的數(shù)據(jù)項。如果出現(xiàn)一個錯誤,scanf()返回EOF??刂拼ㄈ愖址?/p>
a、格式限定符 b、空白字符 c、非空白字符
格式限定符以百分號開始,告訴scanf()下一步要讀的數(shù)據(jù)是什么類型。
C++內(nèi)置流:
cin?? 標準輸入? 鍵盤
cout? 標準輸出? 屏幕
cerr? 標準錯誤輸出 屏幕
clog? cerr的緩沖版本 屏幕
cin、cout、cerr和C的stdin、stdout、stderr相對應。
C++附加流:win、wout、werr、wlog它們都是款字符版本的標準流,寬字符類型為wchar_t,一般為16位。
29、fmtflags setf(fmtflags flags);
該函數(shù)返回格式標記先前的并開啟又flags指定的那些標記。
eg:
cout.setf(ios::showpoint);
cout.setf(ios::showpos);
或者cout.setf(ios::showpoint | ios::showpos);
30、void unsetf(fmtflags flags);
flags指定的標記被清除
eg:
cout.setf(ios::uppercase | ios::scientfic);
cout.unsetf(ios::uppercase);
31、fmtflags flags();
返回每個格式標記的當前位置。
32、fmtflags flags(fmtflags f);
設(shè)置某個流的所有標記。
eg:
ios::fmtflags f = ios::showpos | ios::showbase | ios::oct | ios::right;
cout.flags(f);//set all flags
33、streamsize width(streamsize w);
修改最小域?qū)?,w是將要改成的域?qū)挘惹暗挠驅(qū)挿祷亍?/p>
34、streamsize precision(streamsize p);
當輸出浮點型時,可以使用precision()函數(shù)來確定數(shù)字的精確位數(shù)。
35、char fill(char ch);
填充指定字符,默認情況下是空格
C++操作算子
操作算子? 用途??? 輸入/輸出
boolapha? 開啟boolapha標記 輸入/輸出
dec??? 開啟dec標記?? 輸出
endl?? 輸出一個換行符并刷新流 輸出
ends?? 輸出一個null?? 輸出
fixed?? 開啟fixed標記?? 輸出
flush?? 刷新一個流??? 輸出
hex??? 開啟hex標記??? 輸出/輸入
internal? 開啟internal標記? 輸出
left?? 開啟left標記?? 輸出
noboolalpha? 關(guān)閉noboolalpha標記? 輸入/輸出
noshowbase? 關(guān)閉showbase標記? 輸出
noshowpoint? 關(guān)閉showpoint標記? 輸出
noshowpos? 關(guān)閉showpos標記?? 輸出
noskipws? 關(guān)閉skipws標記?? 輸入
nounitbuf? 關(guān)閉unitbuf標記?? 輸出
nouppercase? 關(guān)閉uppercase標記? 輸出
oct??? 開啟oct標記??? 輸入/輸出
resetiosflags(fmtflags f) 關(guān)閉f中指定的標記 輸入/輸出
right??? 開啟right標記?? 輸出
scientific? 開啟scientific標記? 輸出
setbase(int base) 將基數(shù)設(shè)為base? 輸入/輸出
setfill(int ch)?? 將填充字符設(shè)置為ch 輸出
setiosflags(fmtflags f)開啟f中指定的標記 輸入/輸出
setprecision(int p)? 設(shè)置字符精度? 輸出
setw(int w)?? 將域?qū)捲O(shè)置為w? 輸出
showbase?? 開啟showbase標記 輸出
showpoint?? 開啟showpoint標記 輸出
showpos??? 開啟showpos標記? 輸出
skipws???? 開啟skipws標記? 輸入
unitbuf??? 開啟unitbuf標記? 輸出
uppercase?? 開啟uppercase標記 輸出
ws???? 跳過開始的空格? 輸入
注意:在訪問帶參數(shù)的操算子,必須在程序中包括<iomanip>
創(chuàng)建自己的插入器:
ostream& operator<<(ostream& stream,class_type obj)
{
?//body of inserter
?return stream;
}
創(chuàng)建自己的析取器
istream& operator>>(istream& stream,class_type obj)
{
?//body of extractor
?return stream;
}
C++文件的輸入和輸出<fstream>
創(chuàng)建一個流
ifstream in;//input
ofstream out;//output
fstream io;//input and output
36、
void ifstream::open(const char*filename,ios::opennode mode = ios::in);
void ofstream::open(const char*filename,ios::openmode mode = ios::out | ios::trunc);
void fstream::open(const char* filename,ios::openmode mode = ios::in | ios::out);
openmode:
ios::app 使所有輸出到相應文件的內(nèi)容都添加到文件末尾,該值只能用于具有輸出功能的文件。
ios::ate? 使得在打開文件時能夠定位到文件末尾
ios::binary? 可以以二進制文件打開,默認情況下,所有文件都以文本方式打開。
ios::in? 指定為輸入
ios::out 制定我輸出
ios::trunc 銷毀具有相同名字的先前文件的內(nèi)容,并且將文件長度截斷為0,當使用ofstream創(chuàng)建一個輸出流時任何先前存在的具有該文件名的文件將被自動截斷
eg:
if(!mystream)
{
?cout<<"Cannot open file.\n";
?//handdle error
}
if(!mystream.is_open())
{
?cout<<"Cannot open file.\n";
?//handdle error
}
37、istream &get(char &ch);
?ostream &put(char &ch);
eg:
while(in.get(ch))
?cout<<ch;
38、istream& read(char* buf,streamsize num);
?ostream& write(const char* buf,streamsize num);
read()函數(shù)從流中讀取num字符并將他們放入由buf所指的緩沖區(qū)。write()函數(shù)把num字符從buf所指的緩沖區(qū)寫入調(diào)用流,streamsize是由C++庫定義的類型--是某種類型,它可以存儲能夠被任何一種I/O操作轉(zhuǎn)換的最大字符數(shù)。
39、streamsize gcount();
檢查已經(jīng)有多少字符被讀取
40、get()的重載版本:
istream& get(char* buf,streamsize num);
把字符讀入由buf指向的數(shù)組,直到讀取到第num-1個字符,發(fā)現(xiàn)了一個換行符或者遇到了文件尾。指針buf所指向的數(shù)組以null字符結(jié)束。
istream& get(char* buf,streamsize num,char delim);
把字符讀入由buf指向的數(shù)組,直到讀取到第num-1個字符,發(fā)現(xiàn)了由delim指定的字符或者是遇到了文件尾。指針buf所指向的數(shù)組以null字符結(jié)束。如果在輸入流中遇到分隔符字符,則不會提取該字符。
int get();
返回相應流的下一個字符,如果遇到文件尾,則返回EOF。get()函數(shù)的這種形式類似于C的函數(shù)
41、istream& getline(char* buf,streamsize num);
把字符讀入由buf指向的數(shù)組,直到讀取到第num-1個字符,發(fā)現(xiàn)了一個換行符或者遇到了文件尾。指針buf所指向的數(shù)組以null字符結(jié)束。如果在出輸入流中遇到換行符是,則提取該字符,但是不會將其放入buf
?istream& getline(char* buf,streamsize num,char delim);
把字符讀入由buf指向的數(shù)組,直到讀取到第num-1個字符,發(fā)現(xiàn)了由delim指定的字符或者是遇到了文件尾。指針buf所指向的數(shù)組以null字符結(jié)束。如果在輸入流中遇到分隔符字符,則提取該字符,但是不將其放入buf
42、bool eof();
到達文件尾時,該函數(shù)返回true,否則返回false
43、istream & ignore(streamsize num = 1,int_type delim = EOF);
該函數(shù)讀取和放棄字符,直到num個字符被忽略(默認值為1)或者遇到delim指定為字符(默認值為EOF)
44、int_type peek();
返回流中的下一個字符,如果遇到文件尾,則返回EOF(int_type 被定義為某種整數(shù)型類型)
45、istream& putback(char c);
返回流中的最后一個字符,c是讀取最后一個字符
46、ostream& flush();
在緩沖區(qū)被寫滿數(shù)據(jù)前強行將數(shù)據(jù)寫到磁盤
47、istream& seekg(off_type offset,seekdir origin);
?ostream& seekp(off_type offset,seekdir origin);
off_type是ios定義的一個整數(shù)類型,可以包含offset具有的最大有效值,seekdir是一個ios定義的枚舉類型,用來決定查找方式。seekg()函數(shù)可以把相關(guān)文件當前的獲取指針從指定origin出偏移offset個字符,origin必須是一下三個值中的一個
ios::beg?? 文件頭
ios::cur? 當前位置
ios::end? 文件尾
seekp()函數(shù)可以把相關(guān)文件當前的獲取指針從指定origin出偏移offset個字符,origin必須是以上三個值之一
48、pos_type tellg();
?pos_type tellp();
確定每一個文件指針的位置。pos_type是ios定義的類型,它存儲函數(shù)可以返回最大值。
I/O狀態(tài):保存在一個iostate類型的對象中,它是ios定義的枚舉類型,包括一下成員:
ios::goodbit?? 無錯誤位設(shè)置
ios::eofbit??? 當遇到文件尾時為1;否則為0
ios::failbit?? 當出現(xiàn)非致命錯誤時為1,否則為0
ios::badbit??? 當出現(xiàn)致命的I/O錯誤時為1;否則為0
獲得I/O狀體的方法:
a、iostate rdstate();
b、bool bad();
?? bool eof();
?? bool fail();
?? bool good();
一旦出現(xiàn)錯誤,或許在程序繼續(xù)運行之前需要清除該錯誤,為此,可以使用clear()函數(shù)
void clear(iostate flags = ios::goodbit);