Как настроить istream_iterator, чтобы не игнорировать пустые строки - PullRequest
1 голос
/ 05 августа 2010

У меня проблемы с чтением файла 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 ]

1 голос
/ 05 августа 2010

Если новые строки являются единственными разделителями в вашей строке, вы можете настроить 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;
}

В противном случае, да, строкавходные итераторы и линейные прокси - отличные решения для общего случая.

1 голос
/ 05 августа 2010

Проблема здесь на самом деле не с istream_iterator, а с потоками, которые настроены для обработки всех последовательных «пробелов» как единого разделителя.

Как я обрисовал в предыдущемответ, есть несколько способов заставить istream_iterator до читать построчно .Обратите внимание, что они будут работать немного иначе при одном другом обстоятельстве: если у вас есть более одного слова в строке, например: «Есть \ nfour \ n \ nstrings», это будет читать «Есть» в виде одной строки, гдеВаш оригинал будет читать его как две отдельные строки.Я не уверен, что вы действительно хотите в этом случае (или, может быть, это никогда не возникнет, так что вам все равно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...