要求:
编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置。当用户按下键盘的“enter”键时,数据输入结束。程序自动对所有的整数进行求和并打印出结果。
#include<iostream>
using namespace std;
int main(){
int sum=0;
cout<<"输入任意一串整数和任意数目的空格:";
int i;
while(cin>>i){
sum+=i;
while(cin.peek()==' '){
cin.get();
}
if(cin.peek()=='\n'){
break;
}
}
cout<<"result is: "<<sum<<endl;
return 0;
结果:
/home/cmf/CLionProjects/untitled1/cmake-build-debug/untitled1
输入任意一串整数和任意数目的空格:11 22 33 44
result is: 110
Process finished with exit code 0
}
从程序中看到:
- 首先我们知道在用户不进行键盘输入,进程将会阻塞。(也就是输入窗口一直停滞不前)。这是阻塞IO的一个例子。
- “>>”最开始在c中的定义是右移操作符,它在c++中进行了重载,当它按照上述代码所示的方式使用时,它就用于输入流对象提取。另外这个操作符对所有内建的数据类型都进行了重载,所以它可以从输入流对象提取出int,float,double型数据,也可以提取字符串等数据。
- 在while(cin>>i)中,表达式cin>>i返回输入流本身,也就是cin,但是如果到达了文件尾或者提取操作符遇到一个非法值,这个返回值将是false。(也就是说当提取到最后没有内容时,将会返回false=0[假],即while循环结束)
cpp /home/cmf/CLionProjects/untitled1/cmake-build-debug/untitled1
输入任意一串整数和任意数目的空格:3.14
result is: 3
Process finished with exit code 0
//它将3提取完后,提取到小数点时,会返回false,退出while循环,所以结果为3
关于c++的输入输出详述
程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。
一、C++输入输出包含以下三个方面的内容:
- 对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。
- 以外存磁盘文件为对象进行输入和输出。即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。
- 对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出,简称串I/O。
C++编译系统提供了用于输入输出的iostream类库。意为输入输出流。在iostream类库中包含许多用于输入输出的类。
二、关于输入输出的几个流类
图1中的箭头代表派生类。ios是抽象基类,它派生出istream和ostream。istream和ostream又共同派生出了iostream类。为了避免多继承的二义性,从ios派生出istream和ostream时,均使用virtual关键字(虚继承)。
三、与iostream类库有关的头文件
iostream类库中不同的类的声明被放在不同的头文件中,用户在自己的程序中用#include命令包含了有关的头文件就相当于在本程序中声明了所需要用到的类。
可以换 —种说法:头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现。常用的有
• iostream 包含了对输入输出流进行操作所需的基本信息。
• fstream 用于用户管理的文件的I/O操作。
• strstream 用于字符串流I/O。
• stdiostream 用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序。
• iomanip 在使用格式化I/O时应包含此头文件。
四、iostream头文件中四个标准流对象
iostream头文件中定义了四个标准流对象,它们是cin、cout、cerr和clog。
- cin 对应于标准输入流,用于从键盘读取数据,也可以被重定向为从文件中读取数据。
- cout 对应于标准输出流,用于向屏幕输出数据,也可以被重定向为向文件写入数据。
- clog 对应于标准错误输出流,用于向屏幕输出错误信息,不能被重定向。
- cerr 对应于标准错误输出流。
标准库输出除了定义了cout之外,标准库还定义了cerr和clog,我们通常用cerr来输出警告和错误信息,因此它也被称为标准错误。而clog用来输出程序运行时的一般性信息。
cerr和clog的区别在于:cerr不适用缓冲区,直接向显示器输出信息;而输出到clog中的信息会先被存放到缓冲区,缓冲区满或者刷新时才输出到屏幕。
ostream类的无参构造函数和复制构造函数都是私有的,因此在程序中一般无法定义ostream类的对象,唯一能用的ostream类的对象就是cout。
cout可以被重定向,而cerr不能。所谓重定向,就是将输入的源或输出的目的地改变。例如,cout本来是输出到屏幕的,但是经过重定向,本该输出到屏幕上的东西就可以被输出到文件中。
五、cout流对象详解
cout是console output的缩写,意为在控制台(终端显示器)的输出。强调几点。
- cout不是C++预定义的关键字,它是ostream流类的对象,在iostream中定义。 顾名思义,流是流动的数据,cout流是流向显示器的数据。
- cout流中的数据是用流插入 运算符“<<”顺序加入的。 用“cout<<”输出基本类型的数据时,可以不必考虑数据是什么类型,系统会判断数 据的类型,并根据其类型选择调用与之匹配的运算符重载函数。这个过程都是自动的,用户不必干预。如果在C语言中用prinf函数输出不同类型的数据,必须分别指定相应的输出格式符,十分麻烦,而且容易出错。C++的I/O机制对用户来说,显然是方便而安全的。
- cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符,并刷新流(清空缓冲区)。 注意如果插入一个换行符”\n“(如cout<<a<<"\n"),则只输出和换行,而不刷新cout流(但并不是所有编译系统都体现出这一区别)。
- 在iostream中只对"<<“和”>>“运算符用于标准类型数据的输入输出进行了重载,但未对用户声明的类型数据的输入输出进行重载。如果用户声明了新的类型,并希望用”<<“和”>>"运算符对其进行输入输出,按照重运算符重载来做。
未完待续。。。
参考文章:C++输入和输出流