Ввод/вывод (С++)
Стандартная библиотека C++ |
---|
Контейнеры |
Стандартная библиотека C |
В C++ программирования языке библиотека ввода-вывода относится к семейству шаблонов классов и вспомогательных функций в стандартной библиотеке C++ , которые реализуют возможности потокового ввода-вывода. [1] [2] Это объектно-ориентированная альтернатива потокам C на основе FILE из стандартной библиотеки C. [3] [4]
История
[ редактировать ]Бьерн Страуструп , создатель C++, написал первую версию библиотеки потокового ввода-вывода в 1984 году как типобезопасную и расширяемую альтернативу ввода-вывода C. библиотеке [5] Библиотека претерпела ряд усовершенствований со времени этой ранней версии, включая введение манипуляторов для управления форматированием и шаблонизацию, позволяющую использовать ее с типами символов, отличными от char
.
В результате стандартизации в 1998 году библиотека переехала в std
пространство имен, а основной заголовок изменен с <iostream.h>
к <iostream>
. Именно эта стандартизированная версия рассматривается в оставшейся части статьи.
Обзор
[ редактировать ]Большинство классов в библиотеке на самом деле представляют собой очень обобщенные шаблоны классов. Каждый шаблон может работать с различными типами символов, и даже сами операции, например сравнение двух символов на равенство, можно настроить. Однако большая часть кода должна выполнять операции ввода и вывода, используя только один или два типа символов, поэтому в большинстве случаев доступ к функциональности осуществляется через несколько typedefs , которые определяют имена для часто используемых комбинаций шаблона и типа символов.
Например, basic_fstream<CharT,Traits>
относится к шаблону универсального класса, который реализует операции ввода-вывода над файловыми потоками. Обычно его используют как fstream
что является псевдонимом для basic_fstream<char,char_traits<char>>
или, другими словами, basic_fstream
работа над символами типа char
с набором символьных операций по умолчанию.
Классы в библиотеке можно разделить примерно на две категории: абстракции и реализации. Классы, относящиеся к категории абстракций, предоставляют интерфейс, достаточный для работы с любым типом потока. Код, использующий такие классы, не зависит от точного места, из которого считываются или записываются данные. Например, такой код может записывать данные в файл, буфер памяти или веб-сокет без перекомпиляции. Классы реализации наследуют классы абстракции и предоставляют реализацию для конкретного типа источника или приемника данных. Библиотека предоставляет реализации только для потоков на основе файлов и потоков на основе буфера памяти.
Классы в библиотеке также можно разделить на две группы в зависимости от того, реализуют ли они операции низкого или высокого уровня. Классы, которые имеют дело с низкоуровневыми данными, называются буферами потока. Они работают с символами, не предоставляя никаких функций форматирования. Эти классы очень редко используются напрямую. Классы высокого уровня называются потоками и предоставляют различные возможности форматирования. Они построены поверх потоковых буферов.
В следующей таблице перечислены и классифицированы все классы, предоставляемые библиотекой ввода-вывода.
Сорт | Объяснение | Определения типов |
---|---|---|
Буферы потока (функциональность низкого уровня) | ||
basic_streambuf
|
предоставляет абстрактный низкоуровневый интерфейс ввода/вывода, который можно реализовать для конкретных источников или приемников данных. Редко используется напрямую. |
|
basic_filebuf
|
реализует низкоуровневый интерфейс ввода/вывода для файловых потоков. Редко используется напрямую. |
|
basic_stringbuf
|
реализует низкоуровневый интерфейс ввода/вывода для строковых потоков. Редко используется напрямую. |
|
Классы поддержки | ||
ios_base
|
управляет информацией о форматировании и состоянием исключения | — |
basic_ios
|
управляет буфером потока |
|
Буферы входных потоков (функциональность высокого уровня) | ||
basic_istream
|
оборачивает абстрактный буфер потока и предоставляет интерфейс ввода высокого уровня, например возможности форматирования. |
|
basic_ifstream
|
входной поток, который оборачивает буфер файлового потока. Предоставляет функции для открытия или закрытия файла в дополнение к функциям общего входного потока. |
|
basic_istringstream
|
входной поток, который оборачивает буфер строкового потока. Предоставляет функции для доступа к базовой строке в дополнение к функциям общего входного потока. |
|
Буферы выходных потоков (функциональность высокого уровня) | ||
basic_ostream
|
оборачивает абстрактный буфер потока и обеспечивает интерфейс вывода высокого уровня, например возможности форматирования. |
|
basic_ofstream
|
выходной поток, который оборачивает буфер файлового потока. Предоставляет функции для открытия или закрытия файла в дополнение к функциям общего потока вывода. |
|
basic_ostringstream
|
выходной поток, который оборачивает буфер строкового потока. Предоставляет функции для доступа к базовой строке в дополнение к функциям общего выходного потока. |
|
Буферы потоков ввода/вывода (функциональность высокого уровня) | ||
basic_iostream
|
оборачивает абстрактный буфер потока и предоставляет интерфейс ввода-вывода высокого уровня, например возможности форматирования. |
|
basic_fstream
|
поток ввода/вывода, который оборачивает буфер файлового потока. Предоставляет функции для открытия или закрытия файла в дополнение к функциям общего потока ввода/вывода. |
|
basic_stringstream
|
поток ввода/вывода, который оборачивает буфер строкового потока. Предоставляет функции для доступа к базовой строке в дополнение к функциям общего потока ввода/вывода. |
|
Заголовочные файлы
[ редактировать ]Классы библиотеки ввода/вывода располагаются в нескольких заголовках.
<ios>
содержит определенияios_base
иbasic_ios
классы, которые управляют информацией о форматировании и соответствующим буфером потока.<istream>
содержит определениеbasic_istream
шаблон класса, реализующий форматированный ввод.<ostream>
содержит определениеbasic_ostream
шаблон класса, реализующий форматированный вывод.<iostream>
содержит определениеbasic_iostream
шаблон класса, который реализует форматированный ввод и вывод и включает в себя<ios>
,<istream>
и<ostream>
.<fstream>
содержит определенияbasic_ifstream
,basic_ofstream
иbasic_fstream
шаблоны классов, которые реализуют форматированный ввод, вывод и ввод/вывод в файловых потоках.<sstream>
содержит определенияbasic_istringstream
,basic_ostringstream
иbasic_stringstream
шаблоны классов, которые реализуют форматированный ввод, вывод и ввод/вывод в строковых потоках.<iomanip>
содержит манипуляторы форматирования.<iosfwd>
содержит предварительные объявления всех классов в библиотеке ввода/вывода.
Потоковые буферы
[ редактировать ]Существует двенадцать классов потоковых буферов, определенных на языке C++ в виде таблицы.
Классы поддержки
[ редактировать ]ios_base
и basic_ios
— это два класса, которые управляют битами нижнего уровня потока. ios_base
хранит информацию о форматировании и состояние потока. basic_ios
управляет связанным буфером потока. basic_ios
широко известен как просто ios
или wios
, которые представляют собой два определения типа для basic_ios
с определенным типом персонажа. basic_ios
и ios_base
очень редко используются непосредственно программистами. Обычно доступ к их функциональности осуществляется через другие классы, такие как iostream
которые их наследуют. [6] [7]
Определения типов
[ редактировать ]Имя | описание |
---|---|
ios |
удобство typedef для basic_ios работа с символами типа char
|
wios |
удобство typedef для basic_ios работа с символами типа wchar_t
|
streamoff |
поддерживает внутренние операции. |
streampos |
хранит текущую позицию указателя буфера или указателя файла. |
wstreampos |
хранит текущую позицию указателя буфера или указателя файла. |
streamsize |
определяет размер потока. |
Манипуляторы форматирования
[ редактировать ]Имя | Описание |
---|---|
boolalpha / noboolalpha
|
указывает, являются ли переменные типа bool выглядеть как true и false или как 0 и 1 в потоке.
|
skipws / noskipws
|
указывает, пропускаются ли пробелы при операциях ввода |
showbase / noshowbase
|
указывает, отображается ли система обозначений числа |
showpoint / noshowpoint
|
указывает, отображать ли дробную часть числа с плавающей запятой, если дробная часть равна нулю |
showpos / noshowpos
|
указывает, отображать ли + для положительных чисел
|
unitbuf / nounitbuf
|
указывает, должен ли вывод быть буферизован |
uppercase / nouppercase
|
указывает, следует ли использовать символы верхнего регистра в шестнадцатеричном целочисленном выводе и выводе с плавающей запятой. |
left / right / internal
|
указывает, как число должно быть выровнено |
dec / oct / hex
|
определяет обозначение, в котором должно отображаться целое число |
fixed / scientific / hexfloat ( С++ 11 ) / defaultfloat (С++11)
|
указывает обозначение, в котором должно отображаться число с плавающей запятой |
Потоки ввода/вывода
[ редактировать ]Эту статью может потребовать очистки Википедии , чтобы она соответствовала стандартам качества . Конкретная проблема: Говорится о заголовке, тогда как следует говорить о потоках ввода/вывода. ( Март 2012 г. ) |
C++ Потоки ввода/вывода в основном определяются iostream
, заголовочный файл который является частью стандартной библиотеки C++ (имя означает I nput/ Output , Stream ). В C++ и его предшественнике, языке программирования C , не существует специального синтаксиса для потокового ввода или вывода данных. они объединены в библиотеку функций Вместо этого . Как cstdio
заголовок, унаследованный от C stdio.h , iostream
предоставляет базовые службы ввода и вывода для программ C++. iostream использует объекты cin
, cout
, cerr
, и clog
для отправки данных в и из стандартных потоков ввода, вывода, ошибок (без буферизации) и журнала (с буферизацией) соответственно. Являясь частью стандартной библиотеки C++ , эти объекты являются частью std
пространство имен . [8]
The cout
объект имеет тип ostream
, который перегружает влево, сдвига оператор чтобы заставить его выполнять операцию, совершенно не связанную с побитовыми операциями , и, в частности, оценивать значение левого аргумента, позволяя выполнять несколько операций над одним и тем же объектом ostream, по сути, как другой синтаксис для каскадирования методов , демонстрируя свободный интерфейс . cerr
и clog
объекты также имеют тип ostream
, поэтому они также перегружают этот оператор. cin
объект имеет тип istream
, который перегружает правый оператор битового сдвига. Направления операторов битового сдвига создают впечатление, будто данные текут в выходной поток или уходят из входного потока.
Форматирование вывода
[ редактировать ]Методы
[ редактировать ]width(int x) |
минимальное количество символов для следующего вывода |
fill(char x) |
символ, используемый для заполнения в случае, если ширину необходимо увеличить, чтобы заполнить минимум. |
precision(int x) |
устанавливает количество значащих цифр для чисел с плавающей запятой |
Манипуляторы
[ редактировать ]Манипуляторы — это объекты, которые могут изменять поток с помощью <<
или >>
операторы.
endl |
«конечная строка»: вставляет новую строку в поток и вызывает сброс. |
ends |
«конечная строка»: вставляет в поток нулевой символ и вызывает сброс. |
flush |
заставляет выходной поток записывать любые буферизованные символы |
ws |
заставляет входной поток «съедать» пробелы |
showpoint |
сообщает потоку показывать десятичную точку и несколько нулей с целыми числами |
Остальные манипуляторы можно найти по шапке iomanip
.
Критика
[ редактировать ]Манипуляторы форматирования должны быть «сброшены» в конце, иначе программист неожиданно окажет свое влияние на следующий оператор вывода.
Некоторые реализации стандартной библиотеки C++ содержат значительное количество мертвого кода . Например, GNU libstdc++ автоматически локаль при создает создании ostream
даже если программа никогда не использует типы (дата, время или деньги), на которые влияет локаль, [9]
и статически связанный «Hello, World!» программа , которая использует <iostream>
GNU libstdc++ создает исполняемый файл на порядок больше, чем эквивалентная программа, использующая <cstdio>
. [10] Существуют частичные реализации стандартной библиотеки C++, предназначенные для сред с ограниченным пространством; их <iostream>
может не учитывать функции, которые могут не потребоваться программам в таких средах, например, поддержка локали. [11]
Соглашения об именах
[ редактировать ]Примеры
[ редактировать ]Каноническое «Привет, мир!» программу можно выразить следующим образом:
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
}
Эта программа выведет «Привет, мир!» за которым следует перевод строки и очистка буфера стандартного потока вывода.
В следующем примере создается файл с именем «file.txt» и в него помещается текст «Hello, world!». за которым следует новая строка.
#include <fstream>
int main()
{
std::ofstream file("file.txt");
file << "Hello, world!" << std::endl;
}
Ссылки
[ редактировать ]- ^ ISO/IEC 14882:2003 Языки программирования – C++. [lib.string.streams]/1
- ^ Стэнли Б. Липпман, Жози Лажуа (1999). C++ Primer (третье изд.). Массачусетс: Аддисон-Уэсли. стр. 1109–1112 . ISBN 0-201-82470-1 .
- ^ Бьерн Страуструп (1997). Язык программирования C++ (третье изд.). Аддисон-Уэсли. стр. 637–640 . ISBN 0-201-88954-4 .
- ^ Стэнли Б. Липпман, Жози Лажуа (1999). C++ Primer (третье изд.). Массачусетс: Аддисон-Уэсли. стр. 1063–1067 . ISBN 0-201-82470-1 .
- ^ Бьерн Страуструп. «История C++: 1979–1991» (PDF) .
- ^ Стэнли Б. Липпман, Жози Лажуа (1999). C++ Primer (третье изд.). Массачусетс: Аддисон-Уэсли. стр. 1112–1120 . ISBN 0-201-82470-1 .
- ^ «<ios> Visual Studio 2010» . Microsoft MSDN: Visual Studio 2010 . Проверено 28 сентября 2011 г.
- ^ Хольцнер, Стивен (2001). С++: Черная книга . Скоттсдейл, Аризона: Группа Кориолиса. стр. 584. ИСБН 1-57610-777-9 .
...endl, который очищает выходной буфер и отправляет новую строку в стандартный поток вывода.
- ^ Исходный код GNU libstdc++,
bits/ios_base.h
- ^ C++ против C – восьмой вывод
- ^ «Библиотека uClibc++ C++» . Проверено 6 января 2012 года .