У меня есть проблемы с 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;
}
Проблема здесь не в istream_iterator
, а в потоках, которые настроены так, чтобы обрабатывать все серии последовательных «пробелов» как один разделитель.
Как я уже отмечал в предыдущем ответе, есть несколько способов заставить istream_iterator
в читать построчно . Обратите внимание, что они будут работать немного по-другому при одном другом обстоятельстве: если у вас есть более одного слова в строке, например: «Есть \ nfour \ n \ nstrings», это будет читать «Есть» как одна строка, где ваш оригинал будет читать его как две отдельные строки. Я не уверен, что вы действительно хотите в этом случае (или, может быть, этого никогда не возникнет, так что вам все равно).
Если символы новой строки являются единственными разделителями в вашей строке, вы можете настроить 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;
}
В противном случае, да, итераторы строкового ввода и строковые прокси-серверы отличные решения для общего случая.