流 cout cin
iostream庫,用於程序對文件或屏幕的寫入或讀出。
緩衝區streambuf:流將寫入的數據暫時存儲到緩衝區中,當緩衝區滿才寫入磁盤,主要功能包括:填充、清空、清除等。用於向磁盤寫數據,防止因磁盤讀寫降低程序的性能。
ios輸入輸出基類,包含streambuf;
istream、ostream從ios派生,用於管理輸入輸出。
iostream從istream、ostream派生,用於向屏幕輸入輸出。
fstream從istream、ostream派生,用於向磁盤文件輸入輸出。
標準I/O對象:cin、cout、cerr、clog
重定向:將輸入輸出發送到與默認設備不同的地方。運算符:重定向輸入<,重定向輸出>
CIN
cin |
讀取字符串時,遇到空格或換行則結束讀取,並將讀取到的數據作爲一個數據。 (cin>>data1)>>data2;//運算符>>返回istream的引用,所以可級聯輸入。 |
get() |
返回找到的字符,所以不能級聯輸入。可讀取空格字符。如果達到文件結尾則返回EOF(文件結束標誌,屏幕輸入時,可用CTRL+Z(DOS)或Ctrl + D(Unix)) eg: while((ch = cin.get()) ! = EOF){...} |
get(char) |
返回istream的引用,所以可級聯輸入。可讀取空格字符。 eg: cin.get(ch1).get(ch2);//cin.get(ch1)等價於cin; |
get(char*, maxlen, endchar) |
參數:字符數組指針、讀取的字符數+1(最後一個爲空字符)、結束字符(默認爲'\n') eg: char str[10]; cin.get(str, 10); |
getline(char*, maxlen, endchar) |
參數:字符數組指針、讀取的字符數+1(最後一個爲空字符)、結束字符(默認爲'\n'),注:最後的結束字符會被丟棄,而get讀取結束後,結束字符仍留在輸入緩衝區。 eg:char str1[10], str2[10]; cin.get(str1, 10); cin.getline(str2, 10); 輸入:abc \n 結果:str1 = "abc\0"; str2 = "\0"; 解釋:cin.get讀取到'\n'時,將緩衝區中的"abc"讀取到str1,'\n'未被丟棄,仍在緩衝區中,cin.getline讀取到'\n'就結束讀取。 解決方法:ignore丟棄緩衝區的結束字符。 |
ignore(maxlen, endchar) |
參數:忽略的字符數、結束字符。忽略行結束EOL或文件結束EOF之前的剩餘字符。注:最後的結束字符也會被丟棄。 |
peek() |
查看下一個字符。 eg://字符剔除 while(cin.peek() == "*"){ cin.ignore(1, '*'); } |
putback() |
向輸入流中插入一個字符。 eg://字符替換,將*替換爲# while(cin.get(ch)){ if(ch == '*') cin.putback('#'); } |
COUT
endl |
清除輸出緩衝區。注:調用flush(),也可cout<<flush; |
put |
寫單個字符,返回ostream引用,可級聯輸出。 eg : cout.put('H').put('W'); |
write(char*, maxlen) |
寫maxlen個字符。一般情況下:maxlen = strlen(char*); |
width(widthlen) |
設置默認寬度,注:只改變下一個輸出字段的寬度,當widthlen大於實際輸出寬度時,輸出時右對齊,左側用'\0'填充;當widthlen小於或等於實際輸出寬度時,輸出時按默認寬度輸出。 eg : cout.width(10); cout<<123<<"end\n"; 結果: 123end //有7個空字符 |
fill(newchar) |
width()設置的寬度大於實際寬度時,左側用用newchar填充。注:對以後輸出均有效。 eg : cout.width(10); cout.fill('*'); cout<<123<<"end\n"; 結果:*******123end |
setf(flag) |
flag : 枚舉類型,包括ios::showpoint(顯示尾隨0)、ios::showpos(打開正數前的加號)、ios::uppercase(大寫表示16進制或科學計數法的數)、ios::showbase(顯示進制)ios::left、ios::right、ios::internal(輸出對其方式)、ios::dec(十進制)、ios::oct(八進制)、ios::hex(十六進制)、ios::scientific(科學計數法表示浮點數)、ios::fixed(十進制表示浮點數)。 eg : int number = 185; cout.setf(iso::showbase); cout<<hex<<number; cout.width(10);//同setw(10); #include <iomanip> cout.setf(ios::right); cout<<hex<<number; 輸出:0xb9 0xb9//靠右輸出 |
printf
優:可格式化輸出字符串
缺:不提供類型的安全性、不支持類打印輸出(需逐個變量打印輸出)
#include<stdio.h>
返回輸出的字符個數
格式:%[flags][width][.prec][F|N|h|l]type
flags:輸出樣式
- |
左對齊,右邊填充空格,注:默認情況下右對齊,左側填充空格 |
+ |
顯示數據正負 |
0 |
左側填充0,直到填滿指定列寬 |
|
顯示正數時爲空格,負數時爲-號 |
# |
type是0、x、X時增加前綴0、0x、0X type是e、E、f、g、G時使用小數點 type是g、G時尾部0保留 |
type:輸出數據類型
s/S |
字符串 |
c |
字符 |
d |
整型 |
o |
無符號8進制整數 |
u |
無符號10進制整數 |
f/lf |
浮點數 |
e/E |
浮點數,科學計數法 |
g/G |
f或e的最短形式,小數4位或指數大於等於精度時用e |
p |
16進制輸出指針 |
n |
到此字符前爲止,輸出的字符個數,不輸出文本 |
eg.
%10.5f |
//輸出浮點數,寬度爲10,小數部分寬度爲5,靠右輸出,左側填空格,右側填0 |
%5d |
//輸出整數,寬度爲5,靠右輸出,左側填空格 |
轉義字符
\a |
鈴聲 |
\b |
backspace |
\f |
換頁 |
\n |
換行 |
\r |
回車 |
\t |
水平製表符 |
\v |
垂直製表符 |
\ooo |
八進制ASCII |
\xhh |
十六進制ASCII |
\xhhhh |
十六進制寬字符或Unicode字符 |
文件輸入輸出
#include<fstream.h>
eof()//文件是否結束EOF
bad()//文件是否有非法操作
fail()//文件操作是否失敗或者有非法操作
good()//文件操作正常
eg.
//寫入文件
ofstreamfout("xxx.txt");
fout<<"This is written to the file…\n";
fout.close();
//從文件讀出
ifstreamfin("xxx.txt");
while(fin.get(ch)){
cout<<ch;}
fin.close();
ofstream打開文件參數
open(filename,mode, prot);
mode:打開文件方式
ios::app |
//append,從文件末尾寫入 |
ios::ate |
//at end,指向文件末尾,但可在任意位置寫入 |
ios::trunc |
//truncate,默認,清除文件內容 |
ios::nocreate |
//不創建文件,即文件不存在則打開失敗 |
ios::noreplace |
//不覆蓋文件,文件存在則打開失敗 |
prot:打開的文件屬性
0--普通文件,1--只讀文件,2--隱含文件,4--系統文件
eg.
//二進制文件與結構體數據
XXX xxx;
ofstreamfout("xxx.dat", ios::binary);
fout.write((char*)&xxx,sizeof(XXX));
fout.close();
XXX xxx2;
ifstreamfin("xxx.dat", ios::binary);
fin.read((char*)&xxx2,sizeof(XXX));
fin.close();
注:文件是否打開需進行判斷,if(fin)同if(fin.good())
程序啓動參數
//argc 啓動參數個數,argv啓動參數字符串數組指針
void main(intargc, char **argv);
命名空間
用於避免命名衝突。
編譯器不能檢查不同編譯單元之間的命名衝突,而是由鏈接器進行檢查。
namespaceSpace1{
void method1();//命名空間內所有成員都是public的
class Class1{void method2();};
}
voidSpace1::method1(){}
voidSpace1::Class1::method2(){}
命名空間嵌套:
namespaceSpace1{
namespace Space2{
void method1();
}
}
voidSpace1::Space2::method1(){}
usingnamespace Space1;//將Space1命名空間放到當前作用域。
usingnamespace Space1::
eg.
namespaceSpace1{
int Value1 = 10;
int Value2 = 20;
int Value3 = 30;
}
voidmethod1(){
int Value1 = 1;//隱藏Space1中的Value1
using namespace Space1;
int Value3 = 3;//error,重定義出現歧義
cout<<"value1:"<<Value1<<endl;
cout<<"value2:"<<Value2<<endl;
cout<<"value3:"<<Value3<<endl;//此處會報錯
}
命名空間別名:
namespaceSpace1{
int Value1 = 10;
}
namespaceNewSpace = Space1;//NewSpace爲Space1的別名
未命名的命名空間:
常用於防止全局數據在編譯單元間產生牽制的命名衝突。
namespace{
int Value1 = 10;
}
引入命名空間:
usingnamespace命令將引入命名空間的所有東西,所以儘量使用using而不是using namespace。
eg.
using namespace std; |
//引入std命名空間的所有東西 |
using std::cout; |
//只引入cin |
using std::cin; |
//只引入cout |