Скачиваний:
190
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

4. Изменение основания системы счисления, используемого для отображения данных. Набор констант типа fmtflags (константы форматирования), решаемые ими задачи.

Класс ios_base хранит информацию, описывающую состояние формата. Например, определенные биты в одном элементе этого класса определяют используемое основание системы счисления, в то время как другие — ширину поля. Применяя манипуляторы, можно управлять основанием системы счисления, используемым для отображения целочисленных значений.

С помощью методов-элементов ios_base можно управлять шириной поля и количеством знаков после запятой.

Поскольку класс ios_base является косвенным базовым классом для оstream, то его методы можно применять с объектами класса ostream (или его наследников), например, с объектом cout.

Давайте посмотрим, как устанавливается основание системы счисления для отображения целых чисел. Для управления отображением целых чисел с использованием оснований 10, 16 или 8 можно применять манипуляторы dec, hex и oct. Например, следующий вызов функции устанавливает для объекта cout шестнадцатеричную систему счисления:

hex(cout);

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

Хотя в действительности манипуляторы являются функциями, обычно их используют следующим образом:

cout<< hex;

Класс ostream перегружает операцию << так, что она становится эквивалентной вызову функции hex (cout). Манипуляторы определены в пространстве имен std. Применение манипуляторов иллюстрируется в примере ниже. Эта программа отображает значение целого числа и его квадрата в трех разных системах счисления. Обратите внимание, что манипуляторы можно использовать отдельно или как часть последовательности вставок.

//Пример №3. Использование манипуляторов формата

#include <iostream> int main() { system("chcp 1251"); system("cls"); using namespace std;

//Вывод приглашения к вводу целого числа

cout << "Введите целое число: "; int n; cin >> n; cout << "n n*n\n";

cout << n << " " << n * n << " (decimal) \n"; //Установка шестнадцатеричного режима вывода cout << hex; cout << n << " ";

cout << n * n << " (hexadecimal)\n"; //Установка восьмеричного режима

cout << oct << n << " " << n * n << " (octal) \n";

//Альтернативный способ вызова манипулятора

dec(cout);

cout << n << " " << n * n << " (decimal) \n";

return 0;

}

5. Класс ios_base. Особенности вывода завершающих нулей и десятичных точек. Метод setf(): его аргументы и перегрузки. Использование метода setf() для управления форматированием. Метод usetf(), его аргументы.

Класс ios_base описывает особенности ввода/вывода общие как для входных, так и для выходных потоков, которые не зависят от параметров шаблона.

Некоторые формы вывода, такие как цены или числа в столбцах, смотрятся лучше, если в них присутствуют завершающие нули. Например, вывод примера выше выглядел бы лучше, если бы сумма была представлена как $20.40, а не $20.4. В семействе классов iostream не предусмотрена функция, единственным назначением которой было бы обеспечение этого. Однако класс ios_base предоставляет функцию setf() (т.е. set flag—установить флаг), управляющую некоторыми средствами форматирования.

Класс ios_base также определяет несколько констант, которые могут использоваться в качестве аргументов этой функции. Например, следующий вызов функции вынуждает cout отображать завершающие десятичные точки:

cout.setf(ios_base::showpoint);

В формате с плавающей точкой, используемом по умолчанию, это также обеспечивает отображение завершающих нулей. То есть вместо отображения значения 2.00 в виде 2, cout будет его отображать как 2.00000, если по умолчанию действует точность равная 6. В примере ниже добавлен этот оператор.

showpoint — это статическая константа с областью видимости класса,

определенная в объявлении класса ios_base.

Метод setf() управляет еще несколькими установками формата помимо того, когда должна отображаться десятичная точка.

Функция setf() предоставляет дополнительные средства настройки битов флагов. Функция setf() имеет два прототипа, где параметр_Mask определяет флаги, которые необходимо включить, параметр _Unset определяет флаги, которые необходимо отключить, возвращаемое значение отражает предыдущие значения всех флагов. В случае, если позднее требуется восстановить исходные настройки всех флагов, то это значение можно сохранить.

Второй вариант метода setf() принимает два аргумента и возвращает предыдущие установки:

Эта перегруженная форма функции используется для форматирования нюансов отображения, которые управляются более чем одним битом. Первый аргумент, как и ранее — значение fmtflags, которое содержит требуемые установки. Второй аргумент — это значение, которое очищает соответствующие биты.

Эффекты вызова функции setf() можно отменить с помощью функции unsetf(), имеющей следующий прототип:

Здесь _Mask — битовый шаблон. Все биты _Mask, установленные в 1, вызывают сброс соответствующих битов. То есть метод setf() устанавливает биты в 1, a метод unsetf() возвращает биты к состоянию 0.

6. Класс basic_istream. Оператор >>. Его использование для побитового сдвига вправо и для извлечения данных из потока. Проверка допустимости ввода. Методы get(), getline(), ignore(), read(), peek(), gcount(), putback(): их параметры, перегрузки, пример использования.

Класс basic_istream содержит такие функции, как get(), getline(), read() и перегружаемую операцию извлечения из потока(>>). Класс basic_ostream содержит функции put(), write() и перегружаемую операцию вставки в поток (<<).

В односимвольных режимах операция >> считывает символ и присваивает его указанному целевому объекту. В других режимах она считывает один элемент данных указанного типа. То есть она читает все, начиная с начального символа, отличного от пробельного, вплоть до первого символа, не соответствующего целевому типу.

Проверка допустимости ввода

while (true){//Пока ввод не будет корректным

cout << "Введите целое число: ";

cin >> i; if (cin.good()){//если нет ошибок

cin.ignore(10, '\n'); break; }//выйти из цикла

cin.clear();//Очистить биты ошибок

cout << "Неправильный ввод данных\n";

cin.ignore(10, '\n');//Удалить разделитель строк }

cout << "целое число: " << i;// целое без ошибок }

Методы get(), getline(), ignore(), read(), peek(), gcount(), putback(): их параметры, перегрузки, пример использования.

basic_istream& get(Char_T* str, streamsize count);

basic_istream& get(Char_T* str, streamsize count, Char_T delimiter);

basic_istream& getline(char_type* str, streamsize count);

basic_istream& getline(char_type* str, streamsize count, char_type delimiter);

Первый аргумент является адресом помещения вводимой строки. Второй аргумент — значение на единицу больше максимального количества символов, которые следует прочитать. Дополнительный символ обеспечивает место для ограничивающего нулевого символа, используемого при сохранении ввода в виде строки. Третий аргумент указывает символ, служащий разделителем. Версии, имеющие только два аргумента, применяют в качестве разделителя символ перевода строки. Каждая функция считывает максимальное количество символов или все символы до тех пор, пока не встретит символ-разделитель — в зависимости от того, что случится раньше.

Например, следующий код считывает символьный ввод в символьный массив line:

char line[50];

cin.get(line, 50);

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

Третий аргумент — это символразделитель. Появление разделителя прерывает считывание, даже если максимальное количество символов еще не прочитано.

Метод ignore() принимает два аргумента: число, указывающее максимальное количество символов для чтения, и символ, служащий разделителем при вводе. Например, следующий вызов функции считывает и отбрасывает следующие 255 символов или все символы вплоть до символа перевода строки, в зависимости от того, что произойдет раньше: cin.ignore(255, '\n');

Метод read() считывает заданное количество байтов и сохраняет их в указанном месте.

Например, следующие операторы считывают 144 символа из стандартного ввода и помещают их в массив

gross. char gross[144];

cin.read(gross, 144);

В отличие от getline() и get(), метод read() не добавляет нулевой символ к вводу и, следовательно, не преобразует ввод в строковую форму. Метод read() не предназначен для клавиатурного ввода.

Функция peek() возвращает следующий символ ввода без извлечения его из входного потока.

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

char great_input[80];

char ch;

int i = 0; while ((ch = cin.peek()) !='.'&& ch !='\n ')

cin.get(great_input[i++ ]);

great_input [i] = ' \0';

Метод gcount() возвращает количество символов, прочитанных последним методом неформатированного извлечения .Это подразумевает символы, считанные методом get(), getline(), ignore() или read(), но не операцией извлечения (>>), которая форматирует ввод в соответствии с определенными типами данных. Например, предположим, что вы использовали cin.get(myarray, 80) для чтения строки в массив myarray, и хотите знать, сколько символов было прочитано. Для подсчета символов в массиве применить cin.getcount(), чтобы выяснить, сколько символов только что было считано из входного потока.

Функция putback() вставляет символ обратно в строку ввода. При этом вставленный символ становится первым символом, читаемым следующим оператором ввода.

Метод putback() принимает один аргумент char, представляющий вставляемый символ, и возвращает тип basic_istream &, что позволяет осуществлять конкатенацию вызова с другими методами istream.