一个数据读入时出现的BUG

//定义数据结构
struct PersonInfo{
    std::string name;
    std::vector<std::string> svec;
};
//输出函数
std::ostream & output(std::ostream &os, const PersonInfo &personInfo)
{
    os << "###" << personInfo.name<<"@@@";
    for (auto e : personInfo.svec)
    {
        os << "\t" << e;
    }
    return os;
}

string inputfile("in.txt");
vector<PersonInfo>pvec;
std::ifstream in(inputfile);
if (in)
    {
        string str,phone;
        //1
        //2
        while (std::getline(in,str))
        {
            PersonInfo tmpInfo;  //    1
            std::istringstream strm;// 2

            strm.str(str);
            strm >> tmpInfo.name;
            while (strm >> phone) //while结束会使流strm变无效;
            {
                tmpInfo.svec.push_back(phone); // 3
            }
            pvec.push_back(tmpInfo);
        }
    }
for (auto e : pvec)
{
    output(cout, e) << endl;
}

读入数据:
读入数据
运行结果:
这里写图片描述

分析编写时遇到的错误:

1.如果把标号为1的语句写在while的外面,则会出现如下图的结果:
这里写图片描述
原因:标号为3的语句为向一个容器中添加string元素,tmpInfo的作用域在while外,故其每次循环不会被销毁,每次向容器的尾端添加string元素(只因是容器可以无限添加);

2.如果把标号为2的语句写在while的外面,则会出现如下图的结果:
这里写图片描述
原因:流strm其作用域在while外,每次循环,其不被销毁,因为strm第一次while里面运行时,因为内层的while结束时,使流strm变为无效状态(参考流的条件状态),故无法再次将str拷贝给流strm;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值