流和緩衝區
stream:C++程序把輸入和輸出看做字節流,流充當了程序和流源或流向目標之間的橋樑。
鍵盤輸入每次提供一個字符,因此在這種情況下,程序無需緩衝區來幫助匹配不同的數據傳輸速率。然而,對鍵盤輸入進行緩衝可以讓用戶在將輸入傳輸給程序之前返回並更正。C++程序通常在用戶按下回車鍵時刷新輸入緩衝區。對於屏幕輸出,C++程序通常在用戶發送換行符時刷新輸出緩衝區。
cin: 對應標準輸入流(通常爲鍵盤)
cout:對應標準輸出流(通常爲顯示屏)
cerr:對應標準錯誤流,用於顯示錯誤消息,這個流沒有被緩衝
clog:對應標準錯誤流
當iostream文件爲程序聲明一個cout對象時,該對象將包含存儲了與輸出有關的信息的數據成員,如顯示數據時使用的字段寬帶、小數位數、顯示整數時採用的計數方法以及描述用來處理輸出流的緩衝區的streambuf對象的地址。cout<<"Bjarne"通過指向的streambuf對象將字符串"Bjarne"中的字符放到cout管理的緩衝區中。
使用COUT進行輸出
1. <<
C++用指向字符串存儲位置的指針來表示字符串。對於其他類型的指針,C++將其對應於void*,並打印地址的數值表示。如果要獲得字符串的地址,則必須將其強制轉換爲其他類型。
char name[20] = "Dudly,DDDDDDD";
char* pn = "VVVVVVVVEVEVEV";
cout << "hello!\n";
cout << name<<endl;
cout << pn << endl;
cout << *pn << endl;//pn[0]
cout << (void *)pn << endl;//地址
2.拼接輸出
cout<<"a"<<"b"<<"c" ->a + cout<<"b"<<"c"->ab+cout<<"c"->abc //cout連續輸出
3.其他ostream方法
put:顯示字符
cout.put(65); //顯示ASCII爲65的A
cout.put(66.3)//顯示ASCII爲66的B
write:顯示字符串 write方法並不會在遇到空字符時自動停止打印字符,而只是打印指定數目的字符,即使超出字符串邊界。
#include<iostream>
#include<cstring>
int main() {
using std::cout;
using std::endl;
const char* state1 = "Florida";
const char* state2 = "Kansas";
const char* state3 = "Euphoria";
int len = std::strlen(state1);
cout << "Increasing loop index:\n";
int i;
for (i = 1;i <= len;i++) {
cout.write(state1, i);
cout << endl;
}
cout << "Decreasing Loop index:\n";
for (i = len;i > 0;i--) {
cout.write(state1, i)<<endl;//cout.write()返回cout對象
}
cout << "Exceeding String length:\n";
cout.write(state1, len + 15) << endl;//高能 輸出Florida Kansas E
system("pause");
return 0;
}
4.刷新輸出緩衝區
控制符flush刷新緩衝區,而控制符endl刷新緩衝區,並插入一個換行符
cout<<"hello baby"<<flush;
cout<<"wait a minite"<<endl;
使用cout進行格式化輸出
1.修改顯示時使用的計數系統
hex (16進制),oct(八進制),decimal(10進制)
#include<iostream>
int main() {
using namespace std;
cout << "Enter an integer:";
int n;
cin >> n;
cout << "n n*n\n";
cout << n << " " << n*n << "(decimal)\n";
cout << hex;
cout << n << " " << n*n << "(hex)\n";
cout << oct;
cout << n << " " << n*n << "(oct)\n";
cout << dec;
cout << n << " " << n*n << "(decimal)\n";
system("pause");
return 0;
}
2.調整字段寬度
width()方法隻影響將顯示的下一個項目,然後字段寬度將恢復默認值。默認右對齊。
C++永遠不會截短數據,因此如果試圖在寬度爲2的字段中打印一個7位值,C++將增寬字段,以容納該數據。
#include<iostream>
int main() {
using namespace std;
int w = cout.width(30);
cout << "default field width = " << w << endl;//cout.width(30)返回的是以前的字段寬度,而不是剛設置的值
cout.width(5);
cout << "N" << ":";
cout.width(8);
cout << "N*N" << ":\n";
for (long i = 1;i <= 100;i *= 10) {
cout.width(5);
cout << i << ':';
cout.width(8);
cout << i*i << ":\n";
}
system("pause");
return 0;
}
3.填充字符
cout.fill() 與字段寬度不同的是,新的填充字符將一直有效,直到更改它爲止。
#include<iostream>
using namespace std;
int main() {
cout.fill('*');//填充 一直影響
const char* staff[2] = { "pay","repay" };
long bonus[2] = { 900,1000 };
for (int i = 0;i < 2;i++) {
cout << staff[i] << ":$";
cout.width(7);
cout << bonus[i] << endl;
}
system("pause");
return 0;
}
4.設置浮點數的顯示精度
cout.precision(int) 與fill()一樣,一直有效。
5.打印末尾的0和小數點
cout.setf(ios_base::showpoint)
6.關於setf()
setf有兩個原型。第一個爲 fmtflags setf(fmtflags);
fmtflags | 含義 |
ios_base::boolalpha | 輸入輸出的bool值可以爲True和False |
ios_base::showbase | 對於輸出,使用C++基數前綴(0,0x) |
ios_base::showpoint | 顯示末尾的小數點 |
ios_base::uppercase | 對於16進制輸出,使用大寫字母,E表示法 |
ios_base::showpos |
在正數前面機上“+” |
注意:fmtflags是bitmask類型,bitmask類型是一種用來存儲各個位值的類型。
#include<iostream>
int main() {
using std::cout;
using std::endl;
using std::ios_base;
int temperature = 63;
cout << "Today's water temperatuer:";
cout.setf(ios_base::showpos);//show plus sign
cout << temperature << endl;
cout << "For our programming friends,that's\n";
cout << std::hex << temperature << endl;
cout.setf(ios_base::uppercase);
cout.setf(ios_base::showbase);
cout << temperature << endl;
cout << "about bool:";
cout.setf(ios_base::boolalpha);
cout << true << "\n";
system("pause");
return 0;
}
第二個setf()原型接受兩個參數,並返回以前的設置。
fmtflags setf(fmtflags, fmtflags);
第二個參數 | 第一個參數 | 含義 |
ios_base::basefield | ios_base::dec | 十進制 |
ios_base::oct | 八進制 | |
ios_base::hex | 十六進制 | |
ios_base::floatfield | ios_base::fixed | 使用定點計數法 |
ios_base::scientific | 使用科學計數法 | |
ios_base::adjustfield | ios_base::left | 左對齊 |
ios_base::right | 右對齊 | |
ios_base::internal |
符號或基數前綴左對齊, 值右對齊 |
#include<iostream>
#include<cmath>
using namespace std;
int main() {
cout.setf(ios_base::left, ios_base::adjustfield);
cout.setf(ios_base::showpoint);
cout.setf(ios_base::showpos);
cout.precision(3);
ios_base::fmtflags old = cout.setf(ios_base::scientific, ios_base::floatfield);
cout << "Left Justification:\n";
long n;
for (n = 1;n <= 41;n += 10) {
cout.width(4);
cout << n << "|";
cout.width(12);
cout << sqrt(double(n)) << "|\n";
}
cout.setf(ios_base::internal, ios_base::adjustfield);
cout.setf(old, ios_base::floatfield);//恢復之前的設置
cout << "Internal Justification:\n";
for (n = 0;n < 41;n += 10) {
cout.width(4);
cout << n << "|";
cout.width(12);
cout << sqrt(double(n)) << "|\n";
}
cout.setf(ios_base::right, ios_base::adjustfield);
cout.setf(ios_base::fixed, ios_base::floatfield);
cout << "Right Justification:\n";
for (n = 0;n < 41;n += 10) {
cout.width(4);
cout << n << "|";
cout.width(12);
cout << sqrt(double(n)) << "|\n";
}
system("pause");
return 0;
}
調用setf()效果可以通過unsetf()消除
cout.setf(ios_base::boolalpha)
cout.unsetf(ios_base::boolalpha)
cout.unsetf(ios_base::floatfield) //go to default mode
關於定點計數法fixed參考如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main(void)
{
const double value = 12.3456789;
//fixed把精度設置爲小數點有效位數
cout << value << endl; // 默認以6精度,所以輸出爲 12.3457
cout << setprecision(4) << value << endl; // 改成4精度,所以輸出爲12.35
cout << setprecision(12) << value << endl; // 改成12精度,所以輸出爲12.345679 不顯示末尾0
cout << fixed << setprecision(4) << value << endl; // 加了fixed意味着是固定點方式顯示,所以這裏的精度指的是小數位,輸出爲12.3457
cout << value << endl; // fixed和setprecision的作用還在,依然顯示12.3457
cout.unsetf(ios::fixed); // 去掉了fixed,所以精度恢復成整個數值的有效位數,顯示爲12.35
cout << value << endl;
cout.precision(6); // 恢復成原來的樣子,輸出爲12.3457
cout << value << endl;
cout << fixed << setprecision(12) << value << endl; // 改成12精度,所以輸出爲12.345679 顯示末尾0
cout << value << endl;
system("pause");
}
7.標準控制符
cout<<left<<fixed;
可以使用的控制符有:boolalpha(noboolalpha),showbase(noshowbase),showpoint(noshowpoint),showpos(noshowpos),uppercase(nouppercase),
internal,left,right,dec,hex,oct,fixed,scientific.
8.頭文件iomanip
setprecision() | 接受一個指定精度的整數參數 |
setfill() | 接受一個指定填充字符的char參數 |
setw() | 接受一個指定字段寬度的整數參數 |
#include<iostream>
#include<iomanip>
#include<cmath>
int main() {
using namespace std;
cout << fixed << right;
cout << setw(6) << "N" << setw(14) << "square root" << setw(15) << "fourth root\n";
double root;
for (int n = 10;n <= 100;n += 10) {
root = sqrt(double(n));
cout << setw(6) << setfill('.') << n << setfill(' ')
<< setw(12) << setprecision(3) << root
<< setw(14) << setprecision(4) << sqrt(root) << endl;
}
system("pause");
return 0;
}
歡迎點贊激勵我繼續學習C++。