C ++: Как перебирать текст в std :: string строка за строкой с STL? - PullRequest
17 голосов
/ 16 ноября 2010

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

ОБНОВЛЕНИЕ: Это то, что я искал:

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

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

Ответы [ 3 ]

17 голосов
/ 16 ноября 2010

Почему вы храните текст в исходном файле?Храните его в отдельном текстовом файле.Откройте его с помощью 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 
   }
}

В качестве альтернативы, если текст ДОЛЖЕН быть в переменной std::string, читайте построчно, используя std::istringstream аналогичным образом.

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

std::string text = 
   "Line 1 contents\n"
   "Line 2 contents\n"
   "Line 3 contents\n";
8 голосов
/ 16 ноября 2010

Использование 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 голосов
/ 16 ноября 2010

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

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

...