Форматирование консоли C++ производится

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

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

7
задан Peter Mortensen 9 September 2018 в 20:33
поделиться

4 ответа

Вы можете написать процедуру, которая всегда выводит на стандартный вывод одно и то же количество символов.

Что-то вроде:

string StringPadding(string original, size_t charCount)
{
    original.resize(charCount, ' ');
    return original;
}

А затем используйте это в своей программе:

void list::displayByName(ostream& out) const
{
    node *current_node  = headByName;

    out << StringPadding("Name", 30)
        << StringPadding("Location", 10)
        << StringPadding("Rating", 10)
        << StringPadding("Acre", 10) << endl;
    out << StringPadding("----", 30)
        << StringPadding("--------", 10)
        << StringPadding("------", 10)
        << StringPadding("----", 10) << endl;

    while ( current_node)
    {
        out << StringPadding(current_node->item.getName(), 30)
            << StringPadding(current_node->item.getLocation(), 10)
            << StringPadding(current_node->item.getRating(), 10)
            << StringPadding(current_node->item.getAcres(), 10)
            << endl;
        current_node = current_node->nextByName;
    }
}
2
ответ дан 6 December 2019 в 06:24
поделиться

Думайте об этом как об использовании Microsoft Excel :) Вы думаете о своем потоке как о полях. Таким образом, вы сначала устанавливаете ширину поля, а затем вставляете текст в это поле. Например:

#include <iostream>
#include <iomanip>
#include <string>

int main()
{
    using namespace std;

    string firstName = "firstName",
            secondName = "SecondName",
            n = "Just stupid Text";
    size_t fieldWidth = n.size(); // length of longest text

    cout << setw(fieldWidth) << left << firstName << endl // left padding
         << setw(fieldWidth) << left << secondName << endl
         << setw(fieldWidth) << left << n << endl;

    cout << setw(fieldWidth) << right << firstName << endl // right padding
         << setw(fieldWidth) << right << secondName << endl
         << setw(fieldWidth) << right << n << endl;
}

......

alt text

......

Ширина поля не означает ничего, кроме ширины текста + пробелов . Вы можете заполнить чем угодно, кроме пробелов:

string name = "My first name";
cout << setfill('_') << setw(name.size() + 10) << left << name;

.....

output::
My first name__________

......

Я думаю, что лучший способ - определить свой формат и написать новый форматировщик, который делает все, что вы хотите:

#include <iostream>
#include <iomanip>
#include <string>

std::ostream& field(std::ostream& o)
{
    // usually the console is 80-character wide.
    // divide the line into four fields.
    return o << std::setw(20) << std::right;
}

int main()
{
    using namespace std;

    string firstName = "firstName",
            secondName = "SecondName",
            n = "Just stupid Text";
    size_t fieldWidth = n.size();

    cout << field << firstName << endl
         << field << secondName << endl
         << field << n << endl;
}

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

17
ответ дан 6 December 2019 в 06:24
поделиться

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

Помните, что старый C printf () позволял вам чтобы указать ширину поля. Это пространство заполняет поле, если размер вывода слишком мал (обратите внимание, что он не справляется с полями слишком большого размера).

#include <iostream>
#include <iomanip>
#include <boost/format.hpp>

struct X
{  // this structure reverse engineered from
   // example provided by 'Mikael Jansson' in order to make this a running example

    char*       name;
    double      mean;
    int         sample_count;
};
int main()
{
    X   stats[] = {{"Plop",5.6,2}};

    // nonsense output, just to exemplify

    // stdio version
    fprintf(stderr, "at %p/%s: mean value %.3f of %4d samples\n",
            stats, stats->name, stats->mean, stats->sample_count);

    // iostream
    std::cerr << "at " << (void*)stats << "/" << stats->name
              << ": mean value " << std::fixed << std::setprecision(3) << stats->mean
              << " of " << std::setw(4) << std::setfill(' ') << stats->sample_count
              << " samples\n";

    // iostream with boost::format
    std::cerr << boost::format("at %p/%s: mean value %.3f of %4d samples\n")
                % stats % stats->name % stats->mean % stats->sample_count;
}
6
ответ дан 6 December 2019 в 06:24
поделиться

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

Также помните, что вы поменяли местами Рейтинг и Акры в вашем примере.

3
ответ дан 6 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: