头文件 #include

程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入

cin的三种方式

cin >> n; //Enter、Space、Tab作为结束条件(会将其丢出缓冲区)
ch = cin.get() | cin.get(ch) //Enter作为结束符(不丢弃缓冲区中的Enter,即下次输入的是enter)

cin.getline(数组名,长度,结束符) 大体与 cin.get(数组名,长度,结束符)类似。

cin.get()当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。

变长输入

当输入数据的长度不固定时,即以输入结束符结束时:

abcd...balabla+enter

Ctrl + Z

enter

此时要获取缓冲区中的字符或者数组可以通过以下方式:

char ch;
ch = cin.get();

示例:

#include 
#include
#include 
using namespace std;
void getin(vector &vec){
int val = 0;
char ch;
bool flag = 0, minus = 0; //flag用来标注最后一个val是否输入到vec中,minus判断是否为负
while(ch = cin.get()){
if(ch == '\n') //如果是换行符,结束
break;
if(ch == ' '){ //如果是空格,将空格前的数插入到vec中,开始记录新的数
vec.push_back(val);
val = 0;
flag = 1;
minus = false;
continue;
}
if(ch == '-'){
minus = true;
continue;
}
flag = 0;
if(minus == true){
val = val*10-(ch-'0');
}else{
val = val*10+ch-'0';
}
}
if(flag == 0)
vec.push_back(val);
}
int main(){
vector vec;
getin(vec);
for(int i = 0; i < vec.size(); i++){
cout << vec[i] << " ";
}
cout << endl;
return 0;
}

在输入流与输出流中使用控制符

需要注意的是: 如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。

举例: 输出双精度数。

double a=123.456789012345; //对a赋初值
(1) cout<
(2) cout<
(3) cout<
(4) cout<< setiosflags(ios∷fixed); //输出: 123.456789
(5) cout<
(6) cout<
(7) cout<

下面是整数输出的例子:

int b=123456; //对b赋初值
(1) cout<
(2) cout<
(3) cout<
(4) cout<
(5) cout<
(6) cout<

如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。

例3.1 各行小数点对齐。

#include 
#include 
using namespace std;
int main( )
{
double a=123.456,b=3.14159,c=-3214.67;
cout<
cout<
cout<
cout<
return 0;
}

输出如下: 123.46 (字段宽度为10,右对齐,取两位小数) 3.14 -3214.67 先统一设置定点形式输出、取两位小数、右对齐。这些设置对其后的输出均有效(除非重新设置),而setw只对其后一个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。