在輸入輸出流概念當中有一個非常重要的概念:緩衝區
讀和寫是站在應用程序的角度來說的。輸入的數據會先滯留到緩存區,有輸出命令時回去緩存區拿數據。
1、cin cout
能根據類型 獲取數據/輸入數據
注:cin當遇到結束符(Space、Tab、Enter)時,會停止接受輸入,結束符不會保存到數據中
int main()
{
char mChar[10];
int mInt;
long mLong;
double mDouble;
float mFloat;
cout << "輸入一個字符數組:";
cin >> mChar;
cout << "輸入一個int類型數據:";
cin >> mInt;
cout << "輸入一個long類型數據:";
cin >> mLong;
cout << "輸入一個double類型數據:";
cin >> mDouble;
cout << "輸出一個float類型數據:";
cin >> mFloat;
cout << "字符數組:" << mChar << endl;
cout << "int:" << mInt << endl;
cout << "long:" << mLong << endl;
cout << "double:" << mDouble << endl;
cout << "float:" << mFloat << endl;
cout << "Hello world!" << endl;
system("pause");
return 0;
}
2、cin.get()
無參、一個參數、多個參數,不能接受空格,輸入結束條件是Enter鍵值
int main()
{
char c;
while ((c =cin.get()) != EOF)
{
cout << c << endl;
}
cout << "結束" << endl;
system("pause");
return 0;
}
//注:這裏會出現阻塞,因爲get()是一個字符一個字符讀取的,但是結束命令是EOF,當沒有接收到EOF命令時會一直等待讀取造成阻塞。
//ctr+z 會產生一個 EOF(-1)
int main()
{
char a, b, c;
cin.get(a);
cin.get(b);
cin.get(c);
cout << a << b << c << endl;
cout << "鏈式編程" << endl;
cin.get(a).get(b).get(c);
cout << a << b << c << endl;
system("pause");
return 0;
}
3、cin.getline()可以接受空格
int main()
{
char buf1[1024];
char buf2[1024];
cout << "輸入帶空格的字符串:";
cin.getline(buf1, 1024);
cout << buf1 << endl;
cout << "試着輸入代空格的字符串";
cin >> buf2;
cout << buf2 << endl;
system("pause");
return 0;
}
buf1和buf2的區別在於可不可以輸出代空格的字符串,buf2中流提取操作符遇見空格停止提取輸入流
4、cin.ignore() 跳過輸入流中n個字符
int main()
{
char buf1[256];
char buf2[256];
cout << "假如輸入字符串aa bbccdd:";
cin >> buf1;
cin.ignore(2);//忽略緩衝區中的兩個空格"\n"
cin >> buf2;
//cin.getline(buf2, 256);
cout << "buf1:" << buf1 << "buf2:" << buf2 << endl;
system("pause");
return 0;
}
5、cin.peek()查看輸入流中的下一個字符
int main()
{
int intchar;
char buf1[256];
char buf2[256];
cout << "假如輸入字符串aa bbccdd:";
cin >> buf1;
cin.ignore(2);//忽略緩衝區中的兩個空格"\n"
int mInt = cin.peek();
cout << "緩衝區若有數據,返回第一個數據的asc碼:"<<mInt << endl;
//緩衝區沒有數據,就等待; 緩衝區如果有數據直接從緩衝區中拿走數據
cin.getline(buf2, 256);
cout << "buf1:" << buf1 << "buf2:" << buf2 << endl;
intchar = cin.peek(); //沒有緩衝區 默認是阻塞模式
cout << "緩衝區若有數據,返回第一個數據的asc碼:" << intchar << endl;
system("pause");
return 0;
}
6、cin.putback ()
putback是將字符放回到輸入流中,一般輸入流中字符的長度是不變的。 putback會把cin剛剛“喫”進來的字符再“吐”回去,也就是說,下次cin的時候,剛剛得到的那個字符還會被輸入。
#pragma warning(disable : 4996)
#include <iostream>
#include<string>
using namespace std;
//案例:輸入的整數和字符串分開處理
int main()
{
cout << "Please, enter a number or a word: ";
char c = cin.get();
if ((c >= '0') && (c <= '9')) //輸入的整數和字符串 分開處理
{
int n; //整數不可能 中間有空格 使用cin >>n
cin.putback(c);
cin >> n;
cout << "You entered a number: " << n << '\n';
}
else
{
string str;
cin.putback(c);
getline(cin,str) //字符串 中間可能有空格 使用 cin.getline();
cout << "You entered a word: " << str << '\n';
}
system("pause");
return 0;
}