如何设置istream_iterator以不忽略空行

时间:2010-08-05 15:28:45

标签: c++ stl

我遇到istream_iterator读取文件的问题,因为它忽略了空行,但我需要将这些空白行包含为“”。

我应该如何修改下面的程序来获取向量中的5行?

#include <sstream>
#include <string>
#include <iostream>
#include <vector>
#include <iterator>

using namespace std;
int main(int argc, const char *argv[])
{
    string  test = "There\nare\n\nfive\nstrings";
    stringstream stream(test);
    vector<string> v;
    copy(istream_iterator<string>(stream),istream_iterator<string>(),back_inserter(v));
    cout << v.size() << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

问题不在于istream_iterator - 它与流有关,它被设置为将连续“空格”的所有运行视为单个分隔符。

正如我在上一个回答中所概述的那样,有很多方法可以istream_iteratorread line-by-line。请注意,在另一种情况下,这些将有所不同:如果一行上有多个单词,例如:“有\ nfour \ n \ nstrings”,这将显示“有”作为单个字符串,其中你的原文将它读作两个单独的字符串。我不确定在那种情况下你真正想要的是什么(或者它可能永远不会出现,所以你不关心)。

答案 1 :(得分:1)

如果换行符是字符串中唯一的分隔符,则可以设置boost.tokenizer以保留空标记,并使用它进行解析:

#include <iostream>
#include <string>
#include <vector>
#include <boost/tokenizer.hpp>
int main()
{
        std::string  test = "There\nare\n\nfive\nstrings";

        boost::char_separator<char> sep("\n", "", boost::keep_empty_tokens);
        boost::tokenizer<boost::char_separator<char> > tokens(test, sep);

        std::vector<std::string> v(tokens.begin(), tokens.end());
        std::cout << v.size() << std::endl;
}

否则,是的,行输入迭代器和行代理是很好的通用案例解决方案。