В C ++ языка программирования , ввода / вывода библиотеки относится к семейству шаблонов классов и вспомогательных функций в стандартной библиотеке C ++ , которые реализуют возможности ввода / вывода потока на основе. [1] [2] Это объектно-ориентированной альтернатива C в ФАЙЛ основанных потоки из стандартной библиотеки C . [3] [4]
История
Бьерн Страуструп , создатель C ++, написал первую версию библиотеки потока I / O в 1984 году, в качестве альтернативы типобезопасной и расширяемой к библиотеке C I / O . [5] Библиотека претерпела ряд улучшений, начиная с этой ранней версии, включая введение манипуляторов для управления форматированием и шаблонизацию, позволяющую использовать ее с типами символов, отличными от char
.
В результате стандартизации в 1998 году библиотека была перемещена в std
пространство имен, а основной заголовок изменился с
на
. Именно эта стандартизированная версия рассматривается в оставшейся части статьи.
Обзор
Большинство классов в библиотеке на самом деле являются очень обобщенными шаблонами классов. Каждый шаблон может работать с различными типами символов, и даже сами операции, такие как сравнение двух символов на равенство, могут быть настроены. Однако большая часть кода должна выполнять операции ввода и вывода с использованием только одного или двух типов символов, поэтому в большинстве случаев доступ к функциям осуществляется через несколько определений типов , которые определяют имена для часто используемых комбинаций шаблона и типа символа.
Например, basic_fstream
относится к шаблону универсального класса, который реализует операции ввода / вывода в файловых потоках. Обычно он используется в fstream
качестве псевдонима basic_fstream
или, другими словами, для basic_fstream
работы с символами типа char
с набором операций с символами по умолчанию.
Классы в библиотеке можно разделить примерно на две категории: абстракции и реализации. Классы, попадающие в категорию абстракций, предоставляют интерфейс, достаточный для работы с любым типом потока. Код, использующий такие классы, не зависит от точного места, из которого считываются или записываются данные. Например, такой код может записывать данные в файл, буфер памяти или веб-сокет без перекомпиляции. Классы реализации наследуют классы абстракции и обеспечивают реализацию для конкретного типа источника или приемника данных. Библиотека предоставляет реализации только для потоков на основе файлов и потоков на основе буферов памяти.
Классы в библиотеке также можно разделить на две группы в зависимости от того, реализуют ли они операции низкого или высокого уровня. Классы, которые имеют дело с низкоуровневыми материалами, называются буферами потоков. Они работают с символами, не предоставляя никаких функций форматирования. Эти классы очень редко используются напрямую. Классы высокого уровня называются потоками и предоставляют различные возможности форматирования. Они построены поверх буферов потоков.
В следующей таблице перечислены и классифицируются все классы, предоставляемые библиотекой ввода-вывода.
Класс | Объяснение | Typedefs |
---|---|---|
Буферы потока (функциональность низкого уровня) | ||
basic_streambuf | предоставляет абстрактный низкоуровневый интерфейс ввода / вывода, который может быть реализован для конкретных источников или приемников данных. Редко используется напрямую. |
|
basic_filebuf | реализует низкоуровневый интерфейс ввода / вывода для файловых потоков. Редко используется напрямую. |
|
basic_stringbuf | реализует низкоуровневый интерфейс ввода / вывода для потоков на основе строк. Редко используется напрямую. |
|
Классы поддержки | ||
ios_base | управляет информацией о форматировании и состоянием исключения | N / A |
basic_ios | управляет буфером потока |
|
Буферы входных потоков (функциональность высокого уровня) | ||
basic_istream | оборачивает буфер абстрактного потока и предоставляет интерфейс ввода высокого уровня, например возможности форматирования. |
|
basic_ifstream | входной поток, который обертывает буфер файлового потока. Предоставляет функции для открытия или закрытия файла в дополнение к функциям общего входного потока |
|
basic_istringstream | входной поток, который является оболочкой для буфера строкового потока. Предоставляет функции для доступа к базовой строке в дополнение к функциям общего входного потока |
|
Буферы выходных потоков (функциональность высокого уровня) | ||
basic_ostream | оборачивает буфер абстрактного потока и предоставляет интерфейс вывода высокого уровня, например возможности форматирования. |
|
basic_ofstream | выходной поток, который обертывает буфер файлового потока. Предоставляет функции для открытия или закрытия файла в дополнение к функциям общего потока вывода |
|
basic_ostringstream | выходной поток, который обертывает буфер строкового потока. Предоставляет функции для доступа к базовой строке в дополнение к функциям общего потока вывода |
|
Буферы потоков ввода / вывода (функциональность высокого уровня) | ||
basic_iostream | оборачивает буфер абстрактного потока и предоставляет интерфейс ввода / вывода высокого уровня, например возможности форматирования. |
|
basic_fstream | поток ввода / вывода, который обертывает буфер файлового потока. Предоставляет функции для открытия или закрытия файла в дополнение к функциям общего потока ввода / вывода |
|
basic_stringstream | поток ввода / вывода, который обертывает буфер строкового потока. Предоставляет функции для доступа к базовой строке в дополнение к функциям общего потока ввода / вывода |
|
Заголовочные файлы
Классы библиотеки ввода / вывода находятся в нескольких заголовках.
содержит определенияios_base
иbasic_ios
классы, которые управляют информацией форматирования и связанным буфером потока.
содержит определениеbasic_istream
шаблона класса, который реализует форматированный ввод.
содержит определениеbasic_ostream
шаблона класса, который реализует форматированный вывод.
содержит определениеbasic_iostream
шаблона класса, который реализует форматированный ввод и вывод и включает
,
и
.
содержит определениеbasic_ifstream
,basic_ofstream
иbasic_fstream
шаблоны классов, реализующие отформатированный вход, выход и вход / выход на потоках файлов.
содержит определениеbasic_istringstream
,basic_ostringstream
иbasic_stringstream
шаблоны классов , которые реализуют отформатированный вход, выход и вход / выход на потоках на основе строки.
содержит манипуляторы форматирования.
содержит предварительные объявления всех классов в библиотеке ввода / вывода.
Буферы потока
В языке C ++ существует двенадцать классов буферов потока, определенных в виде таблицы.
Классы поддержки
ios_base
и basic_ios
два класса, которые управляют битами нижнего уровня потока. ios_base
хранит информацию о форматировании и состоянии потока. basic_ios
управляет связанным буфером потока. basic_ios
обычно называют просто ios
или wios
, что представляет собой два определения типов для basic_ios
определенного типа символа. basic_ios
и ios_base
очень редко используются непосредственно программистами. Обычно доступ к их функциям осуществляется через другие классы, например те, iostream
которые их наследуют. [6] [7]
Typedefs
Имя | описание |
---|---|
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 ( C ++ 11 ) / defaultfloat (C ++ 11) | указывает нотацию, в которой должно отображаться число с плавающей запятой |
Потоки ввода / вывода
C ++ ввод - вывод / потоки в первую очередь определяется iostream
, в заголовочном файле , который является частью стандартной библиотеки С ++ (название обозначает I Nput / вывод utput потока ). В C ++ и его предшественнике, языке программирования C , нет специального синтаксиса для потокового ввода или вывода данных. Вместо этого, они объединены в библиотеку из функций . Подобно cstdio
заголовку, унаследованному от stdio.h языка C , iostream
предоставляет базовые службы ввода и вывода для программ на C ++. iostream использует объекты cin
, cout
, cerr
, и clog
для передачи данных в и из стандартных потоков ввода, вывода, ошибки (небуферизован), и журнал (буфер) соответственно. Как часть стандартной библиотеки C ++ , эти объекты являются частью пространства имен . [8]std
cout
Объект имеет типа ostream
, который перегружает левый битый сдвиг оператор , чтобы сделать его выполнить операцию совершенно не связанную с битовыми операциями , и , в частности оценки к значению левого аргумента, что позволяет несколько операций на одном объекте ostream, по существу , как другие синтаксис для каскадирования методов , предоставляющий свободный интерфейс . cerr
И clog
объекты также типа ostream
, поэтому они перегружают , что оператор , а также. cin
Объект имеет тип istream
, который перегружает правильный оператор битового сдвига. Направления операторов битового сдвига создают впечатление, что данные текут к выходному потоку или уходят от входного потока.
Форматирование вывода
Методы
width(int x) | минимальное количество символов для следующего вывода |
fill(char x) | символ, используемый для заполнения в случае, если ширину необходимо удлинить, чтобы заполнить минимум. |
precision(int x) | устанавливает количество значащих цифр для чисел с плавающей запятой |
Манипуляторы
Манипуляторы - это объекты, которые могут изменять поток с помощью операторов <<
или >>
.
endl | "end line": вставляет новую строку в поток и вызывает flush. |
ends | "конец строки": вставляет нулевой символ в поток и вызывает flush. |
flush | заставляет выходной поток записывать любые буферизованные символы |
ws | заставляет поток ввода `` съедать '' пробелы |
showpoint | указывает потоку показывать десятичную точку и некоторые нули с целыми числами |
Остальные манипуляторы можно найти в шапке iomanip
.
Критика
Манипуляторы форматирования намного сложнее использовать и читать, чем эквивалентные строки формата printf . Они также должны быть "сброшены" в конце, иначе вы неожиданно получите их влияние на следующий оператор вывода.
Некоторые реализации стандартной библиотеки C ++ содержат значительное количество мертвого кода . Например, GNU libstdc ++ автоматически создает в локаль при построении ostream
даже если программа не использует какие - либо типы (дата, время или деньги) , что локаль влияет, [9] и статически связаны «Hello, World!» Программа , использующая
GNU libstdc ++, создает исполняемый файл на порядок больше, чем эквивалентная программа, использующая
. [10] Существуют частичные реализации стандартной библиотеки C ++, предназначенные для сред с ограниченным пространством; они
могут не учитывать функции, которые могут не понадобиться программам в таких средах, например поддержку локали. [11]
Соглашения об именах
Примеры
Каноническое "Hello, World!" программу можно выразить следующим образом:
#include int main () { std :: cout << "Привет, мир!" << std :: endl ; }
Эта программа выдаст "Hello, world!" за которым следует новая строка и очистка буфера стандартного выходного потока.
В следующем примере создается файл с именем file.txt и помещается текст «Hello, world!» за которым следует новая строка.
#include int main () { std :: ofstream file ( "файл.txt" ); file << "Привет, мир!" << 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.
- ^ « Visual Studio 2010» . Microsoft MSDN: Visual Studio 2010 . Проверено 28 сентября 2011 года .
- ^ Хольцнер, Стивен (2001). C ++: Черная книга . Скоттсдейл, Аризона: Coriolis Group. п. 584. ISBN 1-57610-777-9.
... endl, который очищает буфер вывода и отправляет новую строку в стандартный поток вывода.
- ^ Исходный код GNU libstdc ++,
bits/ios_base.h
- ^ C ++ против C - восьмой контакт
- ^ «Библиотека uClibc ++ C ++» . Проверено 6 января 2012 года .
Внешние ссылки
- Справочник C ++ для библиотеки ввода / вывода
- Стандартная библиотека Apache C ++ Iostreams
- Подробное руководство по форматированию вывода на C ++