В этом уроке мы вернемся к используемым ранее операторам cin и cout для рассмотрения их в организации форматированного ввода-вывода. Для управления вводом-выводом в C++
используются :
Флаги позволяют установить параметры ввода-вывода, которые будут действовать во всех последующих операторах ввода-вывода до тех пор, пока не будут отменены. Манипуляторы вставляются в операторы cin(cout) и устанавливают параметры текущего оператора ввода-вывода.
Флаги позволяют включить или выключить один из параметров вывода на экран. Для установки флага вывода используется следующая конструкция языка C++:
cout.setf(ios::flag)
Для снятия флага конструкция:
cout.unsetf(ios::flag)
Здесь flag — имя конкретного флага.
Если при выводе необходимо установить несколько флагов, то можно воспользоваться арифметической операцией «или» (|). В этом случае конструкция языка C++ будет такой:
cout.setf(ios::flag1 | ios::flag2 | ios::flag3)
В данном случае flag1, flag2, flag3 — имена устанавливаемых флагов вывода. В таблице ниже приведены некоторые флаги форматного вывода с примерами их использования.
Флаг | Описание | Пример использования | Результат |
right | Выравнивание по правой границе | int r=—25;
| r=-25 |
left | Выравнивание по левой границе (по умолчанию) | double r=—25.45;
| r=-25.45 |
boolalpha | Вывод логических величин в текстовом виде | bool a=true;
| 1 true |
dec | Вывод величин в десятичной системе счисления (по умолчанию) | int r=—25;
| r=-25 |
oct | Вывод величин в восьмеричной системе счисления (для этого нужно снять флаг вывод в десятичной) | int p=23;
| p=27 |
hex | Вывод величин в шестнадцатеричной системе счисления (для этого нужно снять флаг вывод в десятичной) | int p=23;
| p=17 |
showbase | Выводить индикатор основания системы счисления | int r=—25;
| p=0x17 |
uppercase | Использовать прописные буквы в шестнадцатеричных цифрах | int p=29;
| p=1D |
showpos | Выводить знак + для положительных чисел | int p=29;
| p=+29 |
scientific | Экспоненциальная форма вывода вещественных чисел | double p=146.673;
| p=1.466730e+002 |
fixed | Фиксированная форма вывода вещественных чисел (по умолчанию) | double p=146.673;
| p=146.673 |
Флаги удобно использовать в тех случаях, когда следует изменить параметры всех последующих операторов ввода-вывода. Использование большего количества флагов для управления одним оператором ввода-вывода не совсем удобно. Еще одним способом форматирования является использование манипуляторов непосредственно в операторах cin и cout.
Манипуляторы встраиваются непосредственно в операторы ввода-вывода. С одним из них (endl) вы уже знакомы. В таблице ниже приведены основные манипуляторы форматирования с примерами. Для корректного их использования необходимо подключить библиотеку
Манипулятор | Описание | Пример использования | Результат |
setw(n) | Определяет ширину поля вывода в n символов | int r=—253;
| r=253 |
setprecision(n) | Определяет количество цифр (n-1) в дробной части числа | double p=1234.6578;
| p=1234.658 |
left | Выравнивание по левой границе (по умолчанию) | int r=—25;
| r=-25 |
right | Выравнивание по правой границе | int r=—25;
| r=-25 |
boolalpha | Вывод логических величин в текстовом виде | bool a=true;
| true |
noboolalpha | Вывод логических величин в числовом виде | bool a=true;
| 1 |
dec | Вывод величин в десятичной системе счисления (по умолчанию) | int r=0253;
| r=171 |
oct | Вывод величин в восьмеричной системе счисления (для этого нужно снять флаг вывод в десятичной) | int r=253;
| r=375 |
hex | Вывод величин в шестнадцатеричной системе счисления (для этого нужно снять флаг вывод в десятичной) | int r=253;
| r=fd |
showbase | Выводить индикатор основания системы счисления | int p=253;
| p=0XFD |
noshowbase | Не выводить индикатор основания системы счисления | int p=253;
| p=FD |
uppercase | Использовать прописные буквы в шестнадцатеричных цифрах | int p=253;
| p=FD |
nouppercase | Использовать строчные буквы в шестнадцатеричных цифрах | int p=253;
| p=fd |
showpos | Выводить знак + для положительных чисел | int p=29;
| p=+29 |
noshowpos | Не выводить знак + для положительных чисел | int p=29;
| p=29 |
scientific | Экспоненциальная форма вывода вещественных чисел | double p=146.673;
| p=1.466730e+002 |
fixed | Фиксированная форма вывода вещественных чисел (по умолчанию) | cout<<«p=»<<fixed<<p<<endl;
| p=146.673 |
setfill(c) | Установить символ c как заполнитель | cout<<«x=»<<right<<setw(10)<<setprecision(4)<<setfill(‘!’)<<(float) 1/7<<endl;
| x=!!!!0.1429 x=0.1429!!!! |
Другими способами управления шириной поля вывода с помощью операторов являются:
При использовании операторов cin и cout фактически происходит ввод-вывод в текстовый файл. При вводе текстовым файлом является клавиатура, а при выводе — экран дисплея. Cin и cout фактически являются именами потоков (о них мы поговорим в следующих уроках), которые отвечают за ввод и вывод в текстовый файл. Поэтому многие рассмотренные возможности форматированного ввода-вывода будут использоваться и при обработке текстовых файлов.
Похожие записи:
kvodo.ru
Последнее обновление: 15.01.2018
Ряд возможностей по чтению и записи файлов предоставляет пакет fmt.
Этот пакет предоставляет ряд функций для записи данных в произвольный объект, который реализует интерфейс io.Writer
:
fmt.Fprint(), fmt.Fprintln() и fmt.Fprintf().
Функции Fprint и Fprintln имеют примерно одинаковое определение:
func Fprint(w io.Writer, a ...interface{}) (n int, err error) func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
Первым параметром передается объект, который реализует интерфейс io.Writer. А второй параметр представляет набор объектов, которые записываются в поток. Обе функции возвращают количество записанных байтов и информацию об ошибке. Отличием функции Fprintln является то, что она добавляет при выводе перевод строки, то есть фактически записывает строку. Например:
package main import ( "fmt" "os" ) func main() { file, err := os.Create("confeve.txt") if err != nil{ fmt.Println(err) os.Exit(1) } defer file.Close() fmt.Fprint(file, "Сегодня ") fmt.Fprintln(file, "хорошая погода") }
В данном случае обе функции записывают некоторый текст в файл confeve.txt, который будет создан в той же папке, где расположен выполняемый скрипт.
Функция Fprintf упрощает запись сложных по структуре данных:
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
Первым параметром также идет объект io.Writer. Второй параметр представляет строку форматирования, которая указывает, как данные будут форматироваться при записи. И третий параметр — набор значений, которые передаются в строку форматирования и записываются в поток вывода.
Строка форматирования представляет набор спецификаторов. Каждый спецификатор представляет набор символов, которые интерпретируются определенным образом и предваряются знаком процента %. Каждый спецификатор представляет определенный тип данных:
%t
: для вывода значений типа boolean (true или false)
%b
: для вывода целых чисел в двоичной системе
%c
: для вывода символов, представленных числовым кодом
%d
: для вывода целых чисел в десятичной системе
%o
: для вывода целых чисел в восьмеричной системе
%q
: для вывода символов в одинарных кавычках
%x
: для вывода целых чисел в шестнадцатиричной системе, буквенные символы числа имеют нижний регистр a-f
%X
: для вывода целых чисел в шестнадцатиричной системе, буквенные символы числа имеют верхний регистр A-F
%U
: для вывода символов в формате кодов Unicode, например, U+1234
%e
: для вывода чисел с плавающей точкой в экспоненциальном представлении, например, -1.234456e+78
%E
: для вывода чисел с плавающей точкой в экспоненциальном представлении, например, -1.234456E+78
%f
: для вывода чисел с плавающей точкой, например, 123.456
%F
: то же самое, что и %f
%g
: для длинных чисел с плаващей точкой используется %e, для других — %f
%G
: для длинных чисел с плаващей точкой используется %E, для других — %F
%s
: для вывода строки
%p
: для вывода значения указателя — адреса в шестнадцатеричном представлении
Также можно применять универсальный спецификатор %v
, который для типа boolean аналогичен %t
, для целочисленных типов —
%d
, для чисел с плавающей точкой — %g
, для строк — %s
.
К спецификаторам можно добавлять различные флаги, которые влияют на форматирование значений. Например, число перед спецификатором указывает, какую минимальную длину в символах будет занимать выводимое
значение. Например, %9f
— число с плаващей точкой будет занимать как минимум 9 позиций. Если ширина больше, чем требуется значению, то заполняется пробелами.
Для чисел с плавающей точкой можно указать точность или количество символов в дробной части. Для этого количество символов указывается после точки: %.2f
—
две цифры в дробной части после точки. Например, варианты форматирования чисел с плавающей точкой:
%f
: точность и ширина значения по умолчанию
%9f
: ширина — 9 символов и точность по умолчанию
%.2f
: ширина по умолчанию и точность — 2 символа
%9.2f
: ширина — 9 и точность — 2
%9.f
: ширина — 9 и точность — 0
Также из флагов следует отметить дефис -, который дополняет значение пробелами не справа, как по умолчанию, а слева.
Применим функцию Fprintf для вывода в файл:
package main import ( "fmt" "os" ) type person struct { name string age int32 weight float64 } func main() { tom := person { name:"Tom", age: 24, weight: 68.5, } file, err := os.Create("person.dat") if err != nil{ fmt.Println(err) os.Exit(1) } defer file.Close() fmt.Fprintf( file, "%-10s %-10d %-10.3f\n", tom.name, tom.age, tom.weight) }
Функция Fprintf()
в качестве первого параметра также принимает файл, а в качестве второго параметра — строку форматирования,
которая определяет, как данные будут форматироваться. После строки форматирования перечисляются значения, которые вставляются вместо спецификаторов. При этом значения передаются на место спецификаторов по позиции.
Например, первое значение передается вместо первого спецификатора, второе значение — вместо второго спецификатора и так далее. При этом значения должны
соответствовать спецификаторам по типу: на место спецификатора %s должна передаваться строка, на место %d — целое число и т.д.
Таким образом, в примере выше будет создан в одной папке со скриптом файл person.dat, в который будет записаны данные объекта person.
metanit.com
Оператор % по отношению к строкам выполняет операцию форматирования и вставки таким образом, что объект, стоящий справа от него, встраивается согласно определенным правилам в строку слева от него:
string % value
Такой способ форматирования считается старым видимо потому, что заимствован из функции printf() языка C, а в Python кроме него появились более продвинутые средства форматирования вывода. Однако в ряде случаев использование оператора % бывает удобнее, чем использование строкового метода format().
Следует отметить, что форматируются строки, а не вывод. На вывод передается уже сформированная строка.
Оператор деления /
возвращает вещественное число. Если количество знаков бесконечно, то Python выведет его в таком виде:
>>> 4 / 3 1.3333333333333333
Обычно требуется лишь определенное количество знаков. Для этого в строку записывают комбинацию символов, начинающуюся с %. Число после точки обозначает количество знаков после запятой. Символ f обозначает вещественный тип данных float.
>>> "%.4f" % (4/3) '1.3333'
Ставить скобки обязательно, иначе операция % выполняется раньше /:
>>> "%.4f" % 4/3 Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> "%.4f" % 4/3 TypeError: unsupported operand type(s) for /: 'str' and 'int'
Оператор форматирования строк выполняет округление, а не урезание:
>>> "%.4f" % (1.33335) '1.3334' >>> "%.4f" % (1.33334) '1.3333'
С функцией print():
>>> print("Number %.4f" % (1.33334)) Number 1.3333 >>> print("%.4f, %.2f" % (1.33334, 153*0.43)) 1.3333, 65.79 >>> print("%f, %f" % (1.33334, 153*0.43)) 1.333340, 65.790000 >>> 153*0.43 65.78999999999999
>>> "%c" % 121 'y' >>> "%c" % 189 '½' >>> "%c" % 255 'ÿ' >>> "%c" % 999 'ϧ' >>> "%c" % 32400 '纐'
Если вместо символа ‘c’ использовать ‘d’, будет вставлено само целое число.
>>> '%(1)s, %(2).3f' % {'1': 'AB', '2': 2.33333} 'AB, 2.333'
Строковый метод format() возвращает отформатированную версию строки, заменяя идентификаторы в фигурных скобках. Идентификаторы могут быть позиционными, числовыми индексами, ключами словарей, именами переменных.
Аргументов в format() может быть больше, чем идентификаторов в строке. В таком случае оставшиеся игнорируются.
Идентификаторы могут быть либо индексами аргументов, либо ключами:
>>> "{}, {} and {}".format('one', 1, 'I') 'one, 1 and I' >>> "{1}, {2} and {0}".format('one', 1, 'I') '1, I and one'
>>> nums = [3, 4, 5, 6, 2, 0] >>> "{}{}{}".format(*nums) '345' >>> "{0}{2}{4}".format(*nums) '352'
>>> u = {'name':'bob','age':35} >>> '{name}-{age}'.format(**u) 'bob-35' >>> '{name}'.format(**u) 'bob' >>> '{name}-{age}'.format(name="pi",age=3.14) 'pi-3.14' >>> '{0}-{age}'.format("sin",**u) 'sin-35'
Вывод атрибутов объекта:
>>> class house: size = "big" street = "main" >>> h = house() >>> '{0.size}, {0.street}'.format(h) 'big, main'
Можно задавать ширину поля и выравнивание:
>>> '{name:10}-{age:3}'.format(**u) 'bob - 35' >>> '{name:>10}-{age:>3}'.format(**u) ' bob- 35' >>> '{name:^10}-{age:^3}'.format(**u) ' bob -35 '
Вывод вещественных чисел:
>>> '{0}'.format(4/3) '1.3333333333333333' >>> '{0:f}'.format(4/3) '1.333333' >>> '{0:.2f}'.format(4/3) '1.33' >>> '{0:10.2f}'.format(4/3) ' 1.33' >>> '{0:10e}'.format(4/3) '1.333333e+00'
>>> a = "Hello" >>> a.center(10) ' Hello ' >>> a.rjust(10) ' Hello' >>> a.ljust(10) 'Hello ' >>> a.ljust(10,'.') 'Hello.....' >>> a.center(10,'.') '..Hello...' >>> "%s" % (a.center(19)) ' Hello '
pythoner.name