Учебник по C ++: узнайте о вводе и выводе

01

из 08

Новый способ вывода

Код программы
traffic_analyzer / Getty Images

C ++ сохраняет очень высокую обратную совместимость с C, поэтому может быть включен, чтобы дать вам доступ к Е () функция для вывода. Тем не менее, ввод / вывод, предоставляемый C ++, значительно более мощный и, что более важно, безопасный тип. Вы все еще можете использовать зсапЕ () для ввода, но функции безопасности типов, которые предоставляет C ++, означает, что ваши приложения будут более устойчивыми, если вы используете C ++.

В предыдущем уроке это было затронуто примером, который использовал cout. Здесь мы углубимся в глубину, начиная с вывода, так как он более часто используется, чем ввод.

Класс iostream обеспечивает доступ к объектам и методам, которые необходимы для вывода и ввода. Думайте о вводе / выводе с точки зрения потоков байтов - идущих от вашего приложения к файлу, экрану или принтеру - это вывод или с клавиатуры - это ввод.

Выход с Cout

Если вы знаете C, вы можете знать, что << используется для сдвига битов влево. Например, 3 << 3 - 24. Например, сдвиг влево удваивает значение, поэтому 3 сдвига влево умножают его на 8.

instagram viewer

В C ++ << был перегруженный в классе Ostream, так что ИНТ, поплавоки типы строк (и их варианты, например двойники) все поддерживаются. Вот как вы выводите текст, объединяя несколько элементов между <<.>


cout << "Some Text" << intvalue << floatdouble << endl; 

Этот своеобразный синтаксис возможен потому, что каждый из << на самом деле вызов функции, которая возвращает ссылка в ostream объект. Таким образом, строка, как указано выше, на самом деле так


cout. << ("некоторый текст"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl); 

C функцияPrintf удалось отформатировать вывод с помощью спецификаторов формата, таких как% d. В C ++ cout также может форматировать вывод, но использует другой способ сделать это.

02

из 08

Использование Cout для форматирования вывода

Объект Cout является членом iostream библиотека. Помните, что это должно быть включено с


#включают 

Эта библиотека iostream происходит от ostream (для вывода) и IStream для ввода.

Форматирование вывода текста осуществляется путем вставки манипуляторов в выходной поток.

Что такое манипулятор?

Это функция, которая может изменять характеристики выходного (и входного) потока. На предыдущей странице мы видели, что << была перегружена функция, которая возвращала ссылку на вызывающий объект, например cout для вывода или cin для ввода. Все манипуляторы делают это, чтобы вы могли включить их в вывод << или вход >>. Мы посмотрим на вход и >> позже в этом уроке.


считать << endl; 

епсИ это манипулятор, который заканчивает строку (и запускает новую). Это функция, которая также может быть вызвана таким образом.


endl (cout); 

Хотя на практике вы бы этого не сделали. Вы используете это так.


cout << "Some Text" << endl << endl; // Две пустые строки. 

Файлы - это просто потоки

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

  • Текстовый ввод / вывод. Как в консольных приложениях.
  • Строки. Удобно для форматирования.
  • Файловый ввод / вывод.

Снова Манипуляторы

Хотя мы использовали ostream класс, это производный класс от ИОС класс, который происходит от ios_base. Этот класс предков определяет общественность функции которые являются манипуляторами.

03

из 08

Список манипуляторов Cout

Манипуляторы могут быть определены во входных или выходных потоках. Это объекты, которые возвращают ссылку на объект и размещаются между парами <<. Большинство манипуляторов объявлены в, но епсИ, концы и румянец родом из . Несколько манипуляторов принимают один параметр, и они происходят из .

Вот более подробный список.

Из

  • endl - заканчивает линию и вызывает flush.
  • заканчивается - вставляет '\ 0' ( ЗНАЧЕНИЕ NULL) в поток.
  • flush - Принудительно немедленно вывести буфер.

Из . Большинство заявлено в предок . Я сгруппировал их по функциям, а не по алфавиту.

  • boolalpha - вставляет или извлекает объекты bool как "true" или "false".
  • noboolalpha - вставляет или извлекает объекты bool как числовые значения.
  • fixed - вставка значений с плавающей точкой в ​​фиксированном формате
  • научный - Вставьте значения с плавающей точкой в ​​научном формате.
  • внутренний - внутренний - оправдать
  • слева - выравнивание по левому краю.
  • правильно - право оправдать.
  • dec - вставить или извлечь целочисленные значения в десятичном формате.
  • hex - вставить или извлечь целочисленные значения в шестнадцатеричном (основа 16) формате.
  • oct - вставляет или извлекает значения в восьмеричном (базовом 8) формате.
  • noshowbase - не ставьте префикс перед базой.
  • showbase - значение префикса с его базой.
  • noshowpoint - не показывать десятичную точку, если не нужно.
  • showpoint - всегда показывать десятичную точку при вставке значений с плавающей точкой.
  • noshowpos - не вставляйте знак плюс (+), если число> = 0.
  • showpos - вставьте знак плюс (+), если число> = 0.
  • noskipws - не пропускайте начальные пробелы при извлечении.
  • skipws - пропустить начальный пробел при извлечении.
  • nouppercase - не заменяйте строчные буквы на заглавные.
  • верхний регистр - заменить строчные буквы на заглавные эквиваленты.
  • unitbuf - очистить буфер после вставки.
  • nounitbuf - не очищать буфер после каждой вставки.

04

из 08

Примеры использования Cout

// ex2_2cpp. #include "stdafx.h" #включаютиспользование пространства имен std; int main (int argc, char * argv []) { cout.width (10); cout << right << "Test" << endl; cout << left << "Test 2" << endl; cout << internal << "Test 3" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << прописные буквы << "Дэвид" << endl; cout.precision (8); cout << научный << endl; cout << 450678762345.123 << endl; cout << fixed << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: uppercase); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; вернуть 0; }

Вывод этого ниже, с одним или двумя дополнительными пробелами, удаленными для ясности.

 Тестовое задание. Тест 2. Тест 3 46. Дэвид. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4г2. 2322. 1234. 

ЗаметкаНесмотря на заглавные буквы, Дэвид печатается как Дэвид, а не ДЭВИД. Это связано с тем, что прописные буквы влияют только на сгенерированный результат, например числа напечатаны в шестнадцатеричный. Таким образом, шестнадцатеричный вывод 4d2 равен 4D2, когда работает верхний регистр.

Кроме того, большинство из этих манипуляторов фактически устанавливают бит во флаге, и это можно установить непосредственно с помощью

 cout.setf () 

и очистить это с

 cout.unsetf () 

05

из 08

Использование Setf и Unsetf для управления форматированием ввода / вывода

Функция SETF имеет два перегруженный версии показаны ниже. Пока unsetf просто очищает указанные биты.

 setf (flagvalues); setf (flagvalues, maskvalues); unsetf (flagvalues); 

Флаги переменных выводятся ORing вместе все биты, которые вы хотите с |. Так что если вы хотите научный, прописные и болгарские тогда используйте это. Только биты передаются как параметр установлены. Остальные биты остаются без изменений.

 cout.setf (ios_base:: Scientific | ios_base:: uppercase | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; значение bool = true; cout << значение << endl; cout.unsetf (ios_base:: boolalpha); cout << значение << endl; 

Производит

 4D2. 1.234000E + 011. правда. 1. 

Маскирующие биты

Два параметр версия setf использует маску. Если бит установлен как в первом, так и во втором параметре, то он устанавливается. Если бит находится только во втором параметре, он очищается. Ценности Adjustfield, базовое поле и floatfield (перечислены ниже) составные флаги, то есть несколько флагов OR-нут вместе. За basefield со значениями 0x0e00 такой же как дек | окт | наговор. Так

 setf (ios_base:: hex, ios_basefield); 

очищает все три флага и устанавливает наговор. так же adjustfield является левый | правильно | внутренний и floatfield является научный | фиксированный.

Список битов

Этот список перечислений взят из Microsoft Visual C ++ 6.0. Фактические значения используются произвольно - другой компилятор может использовать другие значения.

 skipws = 0x0001. unitbuf = 0x0002. верхний регистр = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. слева = 0x0040. право = 0x0080. внутренняя = 0x0100. dec = 0x0200. окт = 0x0400. hex = 0x0800. научный = 0x1000. исправлено = 0x2000. boolalpha = 0x4000. поле регулировки = 0x01c0. базовое поле = 0x0e00, плавающее поле = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

из 08

О Клоге и Серре

подобно соиЬ, загромождать и сегг предопределенные объекты, определенные в ostream. Класс iostream наследует от обоих ostream и IStream вот почему соиЬ примеры можно использовать iostream.

Буферизованные и небуферизованные

  • Буферизованный - весь вывод временно сохраняется в буфер а затем сбрасывается на экран за один раз. И cout, и clog забуферены.
  • Небуферизованный - все выходные данные сразу отправляются на устройство вывода. Примером небуферизованного объекта является cerr.

Пример ниже демонстрирует, что cerr используется так же, как cout.


#включают использование пространства имен std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Ошибка" << endl; вернуть 0; }

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

 cerr << "Ввод опасной функции zappit" << endl; 

Проблема регистрации

Создание журнала программных событий может быть полезным способом выявления сложных ошибок - типа, которые возникают только время от времени. Если это событие вызывает сбой, у вас есть проблема - вы сбрасываете журнал на диск после каждого вызова, чтобы вы могли видеть события вплоть до сбоя или держать его в буфере и периодически очищать буфер и надеяться, что вы не потеряете слишком много при сбое имеет место?

07

из 08

Использование Cin для ввода: форматированный ввод

Есть два типа ввода.

  • Отформатирован. Чтение ввода как числа или определенного типа.
  • Unformatted. Чтение байтов или строки. Это дает гораздо больший контроль над входным потоком.

Вот простой пример форматированного ввода.

 // excin_1.cpp: Определяет точку входа для консольного приложения. #include "stdafx.h" // Только для Microsoft. #включают использование пространства имен std; int main (int argc, char * argv []) { int a = 0; поплавок b = 0,0; int c = 0; cout << «Пожалуйста, введите int, число с плавающей запятой и int, разделенные пробелами» <> a >> b >> c; cout << "Вы ввели" << a << "" << b << "" << c << endl; вернуть 0; }

Это использует cin, чтобы прочитать три числа (ИНТ, поплавок, int) разделены пробелами. Вы должны нажать клавишу ввода после ввода номера.

3 7.2 3 выведет «Вы ввели 3 7.2 3».

Форматированный ввод имеет ограничения!

Если вы введете 3,76 5 8, вы получите «Вы ввели 3 0,76 5», все остальные значения в этой строке будут потеряны. Что ведёт себя корректно, как то. не является частью int и поэтому отмечает начало поплавка.

Перехват ошибок

Объект cin устанавливает бит сбоя, если входные данные не были успешно преобразованы. Этот бит является частью ИОС и может быть прочитан с помощью провал() функция на обоих CIN и соиЬ как это.

 if (cin.fail ()) // сделать что-нибудь. 

Не удивительно, cout.fail () редко устанавливается, по крайней мере, на экране. В следующем уроке по файловому вводу / выводу мы увидим, как cout.fail () может стать правдой. Также есть хорошо() функция для CIN, соиЬ и т.п.

instagram story viewer