Подтвердить что ты не робот

С++: как перебирать текст в std::string по строкам с помощью STL?

У меня есть текст в объекте std::string. Текст состоит из нескольких строк. Я хочу перебирать текст по строкам с помощью STL (или Boost). Все решения, которые я придумал, кажутся далекими от элегантных. Мой лучший подход - разбить текст на разрывы строк. Есть ли более элегантное решение?

UPDATE: Это то, что я искал:

std::string input;
// get input ...
std::istringstream stream(input);
std::string line;
while (std::getline(stream, line)) {
  std::cout << line << std::endl;
}

Я думал, что уже пробовал. Я получил ошибку компилятора и выбросил. Быстро!

4b9b3361

Ответ 1

Почему вы сохраняете текст в исходном файле? Храните его в отдельном текстовом файле. Откройте его с помощью std:: ifstream и повторите его с помощью while(getline(...))

#include <iostream>
#include <fstream>

int main()
{
   std::ifstream  fin("MyText.txt");
   std::string    file_line;
   while(std::getline(fin, file_line))
   {
      //current line of text is in file_line, not including the \n 
   }
}

В качестве альтернативы, если текст HAS должен находиться в переменной std::string, читайте строку за строкой, используя std::istringstream аналогичным образом

Если ваш вопрос заключается в том, как поместить текст лексически в ваш код без использования +, обратите внимание, что смежные строковые литералы конкатенируются перед компиляцией, поэтому вы можете сделать это:

std::string text = 
   "Line 1 contents\n"
   "Line 2 contents\n"
   "Line 3 contents\n";

Ответ 2

Используйте Boost.Tokenizer:

std::string text("foo\n\nbar\nbaz");

typedef boost::tokenizer<boost::char_separator<char> > line_tokenizer;
line_tokenizer tok(text, boost::char_separator<char>("\n\r"));

for (line_tokenizer::const_iterator i = tok.begin(), end = tok.end();
     i != end ; ++i)
    std::cout << *i << std::endl;

печатает

foo
bar
baz

Обратите внимание, что он пропускает пустые строки, которые могут быть или не быть тем, что вы хотите.

Ответ 3

Если вы хотите выполнить цикл line by line, как вы говорите, почему разделение текста при разрыве строк не будет именно тем, что вы хотите?

Вы не опубликовали код, показывающий, как вы это делаете, но ваш подход кажется правильным, чтобы выполнить то, что вы сказали, что хотите. Почему он чувствует себя хуже?