C++ setfill() Сбой

Извините, если до этого уже обращались, но после нескольких часов поисков я ничего не придумал. Я достаточно новичок в C++, что, возможно, я просто не искал правильные фразы.

По сути, вот краткое изложение моей проблемы.

Я сам прорабатываю учебник (объектно-ориентированное программирование на C++, четвертое издание) (без инструктора). В конце главы 2 есть упражнение (#8), в котором студент просит взять этот код:

long pop1=2425785, pop2=47, pop3=9761;
cout << setw(8) << "LOCATION" << setw(12)
     << "POPULATION" << endl
     << setw(8) << "Portcity" << setw(12) << pop1 << endl
     << setw(8) << "Hightown" << setw(12) << pop2 << endl
     << setw(8) << "Lowville" << setw(12) << pop3 << endl;

И добавляйте периоды между названиями городов и их населением, используя setfill(). У меня уже есть требуемый #include вверху для setw(), и, насколько я нашел, setfill () находится в том же заголовке.

Я использую Code::Blocks 13.12 с (по предложению учебника) компилятором Borland C++ (бесплатная версия 5.5). В тот момент, когда Code:: Blocks не удалось автоматически отформатировать функцию setfill () так, как она отформатировала функцию setw () (выделено зеленым), что-то сразу показалось отключенным. Компилятор даже не выдает предупреждение, но когда я запускаю программу, я получаю неприятное диалоговое окно "chapter2objectives.exe перестало работать". Каждый раз, когда я запускаю эту вещь, она падает.

ВАЖНОЕ НОВОЕ ОБНОВЛЕНИЕ Я только что установил Orwell Dev C++ и скомпилировал этот код там. За исключением того, что не признает system("PAUSE") команда (говорит, что система не определена), код скомпилирован и запущен без сбоев. Это либо проблема Code::Blocks, либо какая-то другая странная вещь.

Я изучаю C++ самостоятельно уже несколько недель. Я уже пробежался по книге C++ for Dummies, у меня 14 лет работы любителем JavaScript-кода, и я понятия не имею, что здесь происходит.

Я пробовал несколько вещей. Очевидно, setfill () принимает значение char; Я делал это так:

long pop1=2425785, pop2=47, pop3=9761;
cout << setw(8) << "LOCATION" << setw(12)
     << "POPULATION" << endl
     << setw(8) << "Portcity" << setfill('.') << setw(12) << pop1 << endl
     << setw(8) << "Hightown" << setfill('.') << setw(12) << pop2 << endl
     << setw(8) << "Lowville" << setfill('.') << setw(12) << pop3 << endl;

Я также много раз пытался перемещать setfill(). Я чаще всего видел его в сети перед setw(), но я пробовал это как до, так и после, я пробовал это только один раз и несколько раз, я пробовал это как отдельный "cout << setfill('). ");" перед выполнением, я даже попробовал альтернативный метод fill (), найденный на ссылочном сайте.... Кажется, что независимо от того, куда я поместил команду setfill (), именно в ту точку, где должен сначала появиться символ заполнения на выходе вся программа вылетает.

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

Любой, у кого есть какие-либо предложения, которые я, возможно, не попробовал, пожалуйста, дайте мне знать! Я ненавижу иметь что-то подобное, которое просто не сработает!

РЕДАКТИРОВАТЬ Вот SSCCE (новый для меня, спасибо!):

#include <cctype>
#include <iomanip>
#include <iostream>
using namespace std;

void ex8()
{
    cout << "Now we'll be printing a table from an example, but with a little something extra thrown in." << endl;

    //#8 Rewrite the WIDTH program so that the characters on each line between the location name and the population number are filled in with periods instead of spaces.
    //Doesn't require anything that isn't already listed with #include (uses IOMANIP, I think)
    //For some strange reason setfill() is broken here.
    cout << "Begin exercise 8:" << endl;
    long pop1=2425785, pop2=47, pop3=9761;
    cout << setw(8) << "LOCATION" << setw(12)
         << "POPULATION" << endl
         << setw(8) << "Portcity" << setfill('.') << setw(12) << pop1 << endl
         << setw(8) << "Hightown" << setfill('.') << setw(12) << pop2 << endl
         << setw(8) << "Lowville" << setfill('.') << setw(12) << pop3 << endl;
}

int main()
{
    int iEx;
    while (true)
    {
        cout << "Enter an exercise number to execute (0 to exit): ";
        cin >> iEx;
        cout << endl;
        if (iEx == 0)
        {
            break;
        }
        switch (iEx)
        {
        case 8:
            ex8();
            break;
        default:
            cout << "No such exercise has been written yet." << endl;
        }
    }
    cout << "Exiting program." << endl;
    //wait until user is ready before terminating program
    //to allow the user to see the program results
    system("PAUSE");
    return 0;
}

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

РЕДАКТИРОВАТЬ 2 Этот код работает без сбоев для всех, кроме меня. Если сообщество захочет, я удалю этот вопрос и просто приму, что в моей системе есть необъяснимая ошибка. Я бы предпочел некоторую помощь в отслеживании того, что может быть причиной (сейчас это просто проблема cout << setfill(), но что, если у меня возникнут будущие сбои из-за какой-то основной проблемы>). Но я понимаю, что некоторые ошибки невозможно отследить.

Я немного смущен джентльменом (или женщиной), который сразу заявил, что проблема не может быть с Code::Blocks. Программа автоматически форматирует все необходимые встроенные функции, кроме команды setfill(). И это команда setfill (), которая сбивает мою систему. Я не знаю, на каком основании вы можете так быстро исключить Code::Blocks, но так как я новичок во всем этом, мне придется просто принять это.

0 ответов

Другие вопросы по тегам