《C++ Primer Plus》學習筆記11,《cprimerplus》
《C++ Primer Plus》學習筆記11
第17章 輸入、輸出和檔案
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
主要內容:
1)C++角度的輸入和輸出
2)iostream類系列
3)重新導向
4)ostream類方法
5)格式化輸出
6)istream類方法
7)流狀態
8)檔案I/O
9)使用ifstream類從檔案輸入
10)使用ofstream類輸出到檔案
11)使用fstream類進行檔案輸入和輸出
12)命令列處理
13)二進位檔案
14)隨機檔案訪問
15)核心格式化
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1、使用cout進行輸出
1)cout
cout << value;//原型:ostream & operator<< (int)
2)其他ostream的方法:
put()方法 ——用於顯示字元
原型:ostream & put(char);
cout.put('W'); //顯示w字母,cout是調用方法的對象,put()是類成員cout.put('i').put('t'); //拼接輸出//在原型合適的情況下,可以將數值型參數用於put(),讓函數原型自動將參數轉化為蒸汽的char值cout.put(65); //將65轉化為char,顯示cout.put(66.3); //將double值66.3轉化為char值66,並顯示對於字元
3)write()方法 ——用於顯示字串
原型:basic_ostream<char T, traits>& write(const char_type* s, streamsize n);
第一個參數提供了要顯示的字串地址,第二個參數指出要顯示多少個字元
注意:write方法不會在遇到Null 字元時自動停止列印字元,而只是列印指定數目的字元,即使超出了字串的邊界。
4)重新整理輸出緩衝區
控制符flush重新整理緩衝區,而控制符endl重新整理緩衝區,並插入一個分行符號號
cout << 'Hello, good-looking! ' << flush;cout << 'Wait just a moment,please. ' << endl;
控制符也是函數,可以直接用flush()來重新整理cout緩衝區
flush(cout);//或者cout << flush;
5)用cout進行格式化
ostream插入操作符將值轉為為文本格式,在預設的情況下,格式化值的方式如下:
①對於char值,一個字元顯示在寬度為一個字元的欄位中
②對於數值整型,以十進位的方式顯示在一個剛好容納該數字以及負號的欄位裡
③字串被顯示在寬度等於該字串長度的欄位中
④浮點型有點變化
新式:浮點類型被顯示為6位,末尾的0不顯示。
老式:浮點類型被顯示帶6位小數,末尾的0也不顯示
注意顯示的位元和數字被儲存的精度是沒有關係的
⑤修改顯示時使用的計數系統
十進位dec,cout預設十進位
十六進位hex控制符
cout << hex;cout << n;
八進位oct控制符
cout << oct;cout << n;
⑥調整欄位的寬度width
int width();//返回欄位寬度的當前設定int width(int i);//將欄位寬度設定為i個空格,並返回以前的欄位寬度值cout.width(12);//記住是靠右對齊
這裡需要注意:width()方法隻影響接下來顯示的一個項目,之後欄位寬度將恢複為預設值。例如
int w = cout.width(30);cout << w;
注意這個時候顯示字串時候,欄位寬度被設定為30,但是顯示w的值時,欄位寬度不是30,因為它影響的是接下來被現實的項目,所以顯示為0
⑦填充字元
cout.fill('*');
注意這裡與width不一樣,它一直有效。
⑧設定浮點度的顯示精度
C++預設的位元是6,末尾的0將不顯示,precision()成員函數使能夠選擇其它值。
cout.precision(2);//將精度設定為2,新的精度設定也一直有效
注意:老式C++版本將預設模式的精度解釋為小數點後面的位置,新式指的是總位元
cout.precision(2);20.4 -> 202.78889 -> 2.8
⑨列印末尾的0和小數點
cout.setf(ios_base::showpoint); //使得cout顯示末尾的小數點,預設精度為6位置20.04 -> 20.4000cout.precision(2);20.40 -> 20.2.78889 -> 2.8
⑩setf()
控制了小數點被顯示時,其他格式的選項
原型一、
fmtflags setf(fmtflags);cout.setf(fmtflags);//程式中這樣書寫
格式常量fmtflags
ios_base::boolalpha //輸入和輸出bool,可以為true或falseios_base::showbase //對於輸出,使用C++基數首碼(0,0x)ios_base::showpoint //顯示末尾的小數點ios_base::uppercase //對於16進位輸出,使用大寫字母Eios_base::showpos //在正數前面加上+
原型二、
fmtflags set(fmtflags, fmtflags);
第一個參數是一個包含了所需要設定fmtflags值,第二個參數指出要清除第一參數的哪些位
setf(long, long)的參數:
第二個參數
ios_base::basefield
對應第一個參數有三個:ios_base::dec(基數10) ios_base::oct (基數8) ios_base::hex (基數16)
第二個參數
ios_base::floatfield
對應第一個參數有兩個:ios_base::fixed(使用定點計數法)ios_base::scientific(使用科學計數法)
補充:C語言中printf()的說明符號,預設的C++模式對應於%g說明符,定點標記法對應於%f的說明符,而科學計數法對應於%e說明符
區分下,三個計數法的區別
預設模式:新式:浮點類型被顯示為6位,精度指的是總位元,末尾的0不顯示。
定點標記法、科學計數法:精度指的是小數點後面的位元,而不是總位元,顯示末尾0
第二個參數
ios_base::adjustfield
對於第一個參數有三個: ios_base::left(靠左對齊) ios_base::right(靠右對齊)ios_base::internal (符號或基數首碼靠左對齊,值靠右對齊)
補充:
標準控制符
cout << showpoint << fixed << right;
iomanip標頭檔#include<iomanip>
最常用的3個控制符:
setprecision() 設定精度
setfill() 填充字元
setw() 欄位寬度
2、使用cin進行輸入
操作符函數原型
istream & operator>> (int &);cin >> staff_size;
cin
1)輸入一個數字
2)接受一個字串,遇到空格、TAB、斷行符號都結束
cin.get()
1)cin.get(ch)用來接收字元
char ch; cin.get(ch);
2)cin.get(s,n)用來接收一行字串,可以接收空格 這個類似於getline 可以輸入多個單詞用空格隔開
char a[20]; cin.get(a,20);
cin.getline()
接受一個字串,可以接收空格。這個和cin(s,n)都需要注意
char m[20] = jklkjilj;cin.getline(m,5);cout << m << endl; //這裡輸出結果為jklk 因為最後一個字元為‘0’
這就可以知道直接上cin.getline()有三個參數,接收字串到m,接收個數,結束符(當省去的時候我們就預設為'\0'或者‘/n’)
char a[20]; cin.getline(a,5);
getline()
接收一個字串,可以接收空格並輸出,需要包含標頭檔#include<string>
注意,getline()屬於string流,所以只有把字串定義為string型,我們才可以用,否則只能用istream流的cin.getline(m,20)
gets()
接收一個字串,可以接收空格並輸出,但是需要加上標頭檔#include<string>
而且需要注意不能寫成m = gets();應該為gets(m)
getchar()
接收一個字元,需要有標頭檔#include<string>
這幾需要注意,不能寫成getchar(ch);應該寫成ch = getchar(); getchar()是C語言的函數,C++也相容,但是少用。
綜上所述,根據我的習慣,C++以後碰到需要輸入帶空格的字元時用char ch; cin.get(ch)
字串#include<string> gets(str)
補充:流是進出程式的位元組流,緩衝區是記憶體中的臨時儲存地區,是程式與檔案或其他裝置之間的橋樑
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<完結於2014.07.24 23:08
看完《C Primer Plus》後可以學習C++?
C和C++ 在編程邏輯上是一樣的,只是抒寫的語言不一樣,並且C++的好處就是它物件導向,用起來比較的方便,更類似於java。如果想學C++,建議還是結合一本專門講C++的書看看,“C++入門到精通.pdf”,從文法上開始學吧,多寫多練,才能掌握的更好。
在學習《c primer plus》的過程中出現一個段錯誤(超出了我的理解範圍)
scanf("%f",weight);少一個&符號