Как Вы устанавливаете istream_iterator для не игнорирования пустых строк

У меня есть проблемы с 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;
}
1
задан tonicebrian 5 August 2010 в 15:28
поделиться

2 ответа

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

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

1
ответ дан 2 September 2019 в 22:24
поделиться

Если символы новой строки являются единственными разделителями в вашей строке, вы можете настроить 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
ответ дан 2 September 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: