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, но так как я новичок во всем этом, мне придется просто принять это.