2013-05-31 2 views
3

Если у меня есть две таблицы, хранящиеся в переменных std::string, как я могу отображать их бок о бок? В частности, ...Разбиение строк символом новой строки в C++

У меня есть std::string table1, который содержит следующее:

X | Y 
------- 
2 | 3 
1 | 3 
5 | 2 

У меня есть std::string table2, который содержит следующее:

X | Y 
------- 
1 | 6 
1 | 1 
2 | 1 
3 | 5 
2 | 3 

Мне нужно изменить их (или на самом деле просто распечатать их к стандартным выходам), чтобы появилось следующее:

X | Y X | Y 
------- ------- 
2 | 3 1 | 6 
1 | 3 1 | 1 
5 | 2 2 | 1 
      3 | 5 
      2 | 3 

Другими словами, у меня есть две таблицы, хранящиеся в переменных std::string с символами новой строки, разделяющими строки.

Я хотел бы напечатать их на экране (используя std::cout), чтобы таблицы отображались бок о бок, вертикально выровненные вверху. Как я могу это сделать?

Например, если я мог бы сделать что-то вроде std::cout << table1.nextToken('\n') где nextToken('\n') дает следующий маркер и маркеры разделяются '\n' характер, то я мог бы придумать способ, чтобы перебрать все маркеры, и как только все table1 лексем , я мог бы просто напечатать символы пробела, чтобы оставшиеся токены table2 были правильно выровнены по горизонтали. Но такой функции nextToken(std::string) не существует. По крайней мере, я не знаю об этом.

+1

См [это QA] (http://stackoverflow.com/q/236129/485561) и [Boost.StringAlgo] (HTTP : //www.boost.org/doc/libs/release/doc/html/string_algo.html). – Mankarse

+0

Отлично, спасибо :) – synaptik

ответ

5

Ключевые слова: istringstream, GetLine

Implementaion:

#include <iostream> 
#include <sstream> 
int main() 
{ 
    std::string table1 = 
     " X | Y\n" 
     "-------\n" 
     " 2 | 3\n" 
     " 1 | 3\n" 
     " 5 | 2\n"; 
    std::string table2 = 
     " X | Y\n" 
     "-------\n" 
     " 1 | 6\n" 
     " 1 | 1\n" 
     " 2 | 1\n" 
     " 3 | 5\n" 
     " 2 | 3\n"; 

    std::istringstream streamTable1(table1); 
    std::istringstream streamTable2(table2); 
    while (!streamTable1.eof() || !streamTable2.eof()) 
    { 
     std::string s1; 
     getline(streamTable1, s1); 
     while (s1.size() < 9) 
      s1 += " "; 
     std::string s2; 
     getline(streamTable2, s2); 
     std::cout << s1 << s2 << std::endl; 
    } 
} 
+1

Вместо добавления пространства в s1 попробуйте 'std :: cout << std :: left << std :: setw (9) << s1 << s2 << std :: endl;' , Требуется заголовочный файл 'iomanip'. – Bee