我遇到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;
}
答案 0 :(得分:1)
问题不在于istream_iterator
- 它与流有关,它被设置为将连续“空格”的所有运行视为单个分隔符。
正如我在上一个回答中所概述的那样,有很多方法可以istream_iterator
到read 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;
}
否则,是的,行输入迭代器和行代理是很好的通用案例解决方案。