Istringstream读取数据的原理以及各类注意事项

接上篇文章我学会了如何读取一行数据,并利用换行符结束,现在我对其原理和一些细节有了更深入的了解,下面先对其读取数据原理做一个简要阐述。

首先我们还是定义一个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');

运行结果如下:

文章本意为记录自己所学,若有错误或不足,敬请指正。

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值