接上篇文章我学会了如何读取一行数据,并利用换行符结束,现在我对其原理和一些细节有了更深入的了解,下面先对其读取数据原理做一个简要阐述。
首先我们还是定义一个string类型的inputline,利用getline函数依次读取inputline中的整数,不过inputline是一个字符类型的,它又是如何变成我们需要的一个又一个整数呢?
答案是我们借助了字符串流Istringstream,我们定义了一个此类型的iss,并将其初始化为inputline中的内容,也就是说,此时我们的iss中内容和inputline是一样的,然后我们利用while循环不停地从iss中提取整数赋给num,那么我们就获得我们所需要的整数类型数据啦。
string inputline;
getline(cin,inputline);
istringstream iss(inputline);
int num;
while(iss>>num)
{
intMedianCalculator.AddNumber(num);
}
为了验证读取是否正确,我们可以再添加一个for循环将我们的数据打印一遍。
cout<<"初始数据为:"<<endl;
for(int val:intMedianCalculator.getData())
{
cout<<val;
}
cout<<endl;
值得注意的是,该方法只能读取整数,当iss无法提取到整数字符时,第一部分代码中的while会被置为false,结束读取,那么就是说这个方法是存在限制与弊端的,后续我将继续学习新的方法并与大家分享。
初始读取数据成功,后续我们又如何继续读入数据呢?
我们可以增设一个选择语句,由用户输入的字符来进行程序下一步的工作。
cout<<"你想要继续添加数据吗?(y/n)"<<endl;
char choice;
cin>>choice;
if(choice!='Y'&&choice!='y')
{
break;//退出循环,结束程序
}
读取到y或者Y时继续读取数据,否则退出循环,结束程序。
那么继续读入数据时我还是采用了上文的方法,利用getline函数与istringstream,如果我们不想定义一个新的string类型的数据来保存输入的数据(类似上文inputline的),其实也可以再次利用inputline,不过需要清空缓冲区,因为inputline此时是有第一次的数据的,不清空的话无法继续输入,至于原理我想可能是因为inputline中其实是含有换行符的,而换行符在第一次读取后并没有清除,所以第二次直接被读取了,就相当于第二次不用输入就结束了读取。下面是我不加清空缓冲区的运行结果:无法输入数据,陷入循环。
加上清除缓冲区的代码后,记得添加头文件limits,不过我在用数组实现该功能的时候也用到了此函数,并没有添加该头文件,但是代码仍然可以运行,这里不添加limits却会报错,我也不知道为什么了,欢迎指教。
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
运行结果如下:
文章本意为记录自己所学,若有错误或不足,敬请指正。