• C++:istringstream只能输入一次的问题


    今天写C++Primer第八章的8.10习题的时候,遇见了问题,代码是这样的:

     

    奇怪的地方在于,我的意思是让他可以输出所有行的所有元素,但奇怪的地方在于,它只输出来第一行的所有元素,一直想不明白为什么,因为按照上面的代码其中iss是得到了后面几行的值的,但它后面始终进不去while循环。

    联想到C中是需要对文件重新置位指针后才能读写的规律,我猜想是否是在一行输入完成之后,指针指到了isringstream的末尾,所以此时虽然重新进行了赋值,但仍然不能输出进str中。

    我想着假如是指针指到了第一行的末尾处的话,假如我第二行更长,那么应该可以输出多出的那些字符。于是我的测试案例变成了

    在此之后我又进行了测试,然而第二行还是没有输出。

    我于是想试一试是否可以把文件指针重新指到开头,看看是否可以输出。

    想了好长时间,想不到C++里有什么可以改变文件指针指向的函数,书上也没讲,又不能在这里用C的。

    但是这时候突然想到了IO库里的通用函数clear()。

    因为我记得输出失败的原因有三种,badbit,failbit,eofbit,

    假如这三种有一种被置位,那么输出就返回失败!

    那么很明白了,C++是使用这三种状态来表示输出状态的,所以第一次输出过后,eofbit置位,此时根本不会进入循环,因为输出返回会是失败!

    改变也很容易,和书上说的一样,使用clear()即可。

    代码如下:

    #include<iostream>
    #include<sstream>
    #include<fstream>
    #include<string>
    #include<vector>
    
    using std::cin;
    using std::cout;
    using std::endl;
    using std::fstream;
    using std::istream;
    using std::ostream;
    using std::istringstream;
    using std::ostringstream;
    using std::string;
    using std::vector;
    
    int main()
    {
        vector<string> vecStr;
        fstream ifs("infile.txt",fstream::in);
        fstream ofs("outfile.txt",fstream::out);
        istringstream iss;
        string str;
        while(getline(ifs,str))
        {
            vecStr.push_back(str);
        }
        cout<<vecStr.size()<<endl;
        for(const auto s:vecStr)
        {
            iss.str(s);
            while(iss>>str)
            {
                ofs<<str<<endl;
            }
            iss.clear();
        }
        return 0;
    }

    这次对了!

  • 相关阅读:
    最小生成树算法
    并查集
    背包问题
    木桶排序
    STL之vector
    STL中的queue用法与stack用法对比
    快速幂求模
    归并排序+典型例题(逆序对)
    负进制转换
    冒泡排序
  • 原文地址:https://www.cnblogs.com/FWFC/p/8601922.html
Copyright © 2020-2023  润新知