2015-02-16 4 views
2

Итак, я пытаюсь создать небольшую текстовую игру для моего первого реального проекта на C++. Когда игра требует большого блока текста, стоит несколько абзацев, у меня возникают проблемы с тем, чтобы он выглядел красиво. Я хочу иметь одинаковые длины линий, и для этого мне просто нужно вручную вводить разрывы строк в подходящих местах. Есть ли команда для этого? Я видел команду setw(), но это не делает обертку текста, если она проходит мимо ширины. Любой совет? Вот что я делаю прямо сейчас, если это помогает.Форматирование текста в C++

cout << " This is essentially what I do with large blocks of" << '\n'; 
cout << " descriptive text. It lets me see how long each of " << '\n'; 
cout << " the lines will be, but it's really a hassle, see? " << '\n';    
+1

Использование файла заголовка предоставляет различные функции для форматирования текста –

+0

@RohitSaluja, вы можете быть более конкретным? Единственный, который я вижу в списке, который я нашел, будет 'setw()', который, я думаю, не работает. Или вы могли бы разместить пример того, как вы это сделаете? – Hammurabi8

ответ

2

Получение или написание функции библиотеки автоматически вставлять ведущие пробелы и новые строки, подходящие для определенной ширины вывода, были бы хорошей идеей. Этот веб-сайт рассматривает рекомендации по библиотеке вне темы, но я включил некоторый код ниже - не особенно эффективный, но понятный. Основная логика должна состоять в том, чтобы перепрыгнуть вперед в строке до максимальной ширины, а затем переместиться назад, пока не найдете пробел (или, возможно, дефис), в котором вы готовы сломать линию ... затем распечатайте ведущие пробелы, а остальные часть линии. Продолжайте, пока не закончите.

#include <iostream> 

std::string fmt(size_t margin, size_t width, std::string text) 
{ 
    std::string result; 
    while (!text.empty()) // while more text to move into result 
    { 
     result += std::string(margin, ' '); // add margin for this line 

     if (width >= text.size()) // rest of text can fit... nice and easy 
      return (result += text) += '\n'; 

     size_t n = width - 1; // start by assuming we can fit n characters 
     while (n > width/2 && isalnum(text[n]) && isalnum(text[n - 1])) 
      --n; // between characters; reduce n until word breaks or 1/2 width left 

     // move n characters from text to result... 
     (result += text.substr(0, n)) += '\n'; 
     text.erase(0, n); 
    } 
    return result; 
} 

int main() 
{ 
    std::cout << fmt(5, 70, 
     "This is essentially what I do with large blocks of " 
     "descriptive text. It lets me see how long each of " 
     "the lines will be, but it's really a hassle, see?"); 

} 

Это не было проверено очень тщательно, но, похоже, работает. См. Прогон here. Для некоторых альтернатив см. this SO question.

BTW, исходный код может быть упрощен ...

cout << " This is essentially what I do with large blocks of\n" 
     " descriptive text. It lets me see how long each of\n" 
     " the lines will be, but it's really a hassle, see?\n"; 

..., как C++ рассматривает заявление незавершенного, пока он не попадет в точке с запятой, и двойными кавычками строковых литералов, которые появляются рядом друг с другом в коде конкатенируются автоматически, как если бы внутренние двойные кавычки и пробелы были удалены.

+0

Я очень новичок в кодировании, и я думаю, что это немного выше моего уровня мастерства. Я ужасно удивлен, что такого типа еще не существует. – Hammurabi8

+0

@ Hammurabi8: Я включил некоторый код .... –

+0

Больной чувак, который отлично работает! Я собираюсь изучить его на некоторое время, чтобы понять, как все это работает, но я действительно впечатлен. Спасибо, что ответили так быстро и с таким опытом! – Hammurabi8

1

Вы можете сделать Tiercé простую функцию

void print(std::string brute, int sizeline) 
{ 
    for(int i = 0; i < brute.length(); i += sizeline) 
      std::cout << brute.substr(i, sizeline) << std::endl; 
} 

int main() 
{ 
    std::string mytext; 

    mytext += "This is essentially what I do with large blocks of"; 
    mytext += "descriptive text. It lets me see how long each of "; 
    mytext += "1the lines will be, but it's really a hassle, see?"; 

    print(mytext, 20); 

    return 0; 
} 

но слова будут резать

выход:

This is essentially 
what I do with large 
blocks ofdescriptiv 
e text. It lets me s 
ee how long each of 
1the lines will be, 
but it's really a ha 
ssle, see? 
+0

Это просто и полезно, спасибо. Тем не менее, что мне нужно сделать, чтобы помешать ему изрубить слова? – Hammurabi8

1

Есть довольно библиотека для обработки форматирования текста, названная cppformat/cppformat на github.

С помощью этого вы можете легко манипулировать форматированием текста.