Ввод/вывод (C++)

Заголовок стандартной библиотеки C++ для ввода/вывода

В языке программирования C++ библиотека ввода/вывода относится к семейству шаблонов классов и вспомогательных функций в стандартной библиотеке C++ , которые реализуют возможности потокового ввода/вывода. [1] [2] Это объектно-ориентированная альтернатива потокам C на основе FILE из стандартной библиотеки C. [3] [4]

История

Бьярне Страуструп , создатель C++, написал первую версию библиотеки потокового ввода-вывода в 1984 году как типобезопасную и расширяемую альтернативу библиотеке ввода-вывода C. [5] Библиотека претерпела ряд усовершенствований с момента этой ранней версии, включая введение манипуляторов для управления форматированием и шаблонизацию, позволяющую использовать ее с типами символов, отличными от char.

Стандартизация 1998 года привела к перемещению библиотеки в stdпространство имен, а основной заголовок изменился с <iostream.h>на <iostream>. Именно эта стандартизированная версия рассматривается в остальной части статьи.

Обзор

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

Например, basic_fstream<CharT,Traits>относится к шаблону универсального класса, который реализует операции ввода/вывода в файловых потоках. Обычно он используется как , fstreamчто является псевдонимом для basic_fstream<char,char_traits<char>>, или, другими словами, basic_fstreamработая с символами типа charс набором операций по умолчанию.

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

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

В следующей таблице перечислены и классифицированы все классы, предоставляемые библиотекой ввода-вывода.

СортОбъяснениеTypedef-ы
Буферы потока (низкоуровневая функциональность)
basic_streambufпредоставляет абстрактный низкоуровневый интерфейс ввода/вывода, который может быть реализован для конкретных источников или приемников данных. Редко используется напрямую.
  • streambuf– действует на символы типаchar
  • wstreambuf– действует на символы типаwchar_t
basic_filebufреализует низкоуровневый интерфейс ввода/вывода для потоков на основе файлов. Редко используется напрямую.
  • filebuf– действует на символы типаchar
  • wfilebuf– действует на символы типаwchar_t
basic_stringbufреализует низкоуровневый интерфейс ввода/вывода для потоков на основе строк. Редко используется напрямую.
  • stringbuf– действует на символы типаchar
  • wstringbuf– действует на символы типаwchar_t
Классы поддержки
ios_baseуправляет информацией о форматировании и состоянием исключения
basic_iosуправляет буфером потока
  • ios– действует на символы типаchar
  • wios– действует на символы типаwchar_t
Буферы входных потоков (высокоуровневая функциональность)
basic_istreamсоздает оболочку для абстрактного потокового буфера и предоставляет высокоуровневый интерфейс ввода, такой как возможности форматирования.
  • istream– действует на символы типаchar
  • wistream– действует на символы типаwchar_t
basic_ifstreamвходной поток, который оборачивает буфер потока файла. Предоставляет функции для открытия или закрытия файла в дополнение к функциям общего входного потока
  • ifstream– действует на символы типаchar
  • wifstream– действует на символы типаwchar_t
basic_istringstreamвходной поток, который оборачивает буфер потока строк. Предоставляет функции для доступа к базовой строке в дополнение к функциям общего входного потока
  • istringstream– действует на символы типаchar
  • wistringstream– действует на символы типаwchar_t
Буферы выходных потоков (высокоуровневая функциональность)
basic_ostreamсоздает оболочку для абстрактного потокового буфера и предоставляет высокоуровневый интерфейс вывода, такой как возможности форматирования.
  • ostream– действует на символы типаchar
  • wostream– действует на символы типаwchar_t
basic_ofstreamпоток вывода, который оборачивает буфер потока файла. Предоставляет функции для открытия или закрытия файла в дополнение к функциям общего потока вывода
  • ofstream– действует на символы типаchar
  • wofstream– действует на символы типаwchar_t
basic_ostringstreamпоток вывода, который оборачивает буфер потока строк. Предоставляет функции для доступа к базовой строке в дополнение к функциям общего потока вывода
  • ostringstream– действует на символы типаchar
  • wostringstream– действует на символы типаwchar_t
Буферы входных/выходных потоков (высокоуровневая функциональность)
basic_iostreamпредставляет собой оболочку абстрактного потокового буфера и предоставляет высокоуровневый интерфейс ввода/вывода, такой как возможности форматирования.
  • iostream– действует на символы типаchar
  • wiostream– действует на символы типаwchar_t
basic_fstreamпоток ввода/вывода, который оборачивает буфер потока файла. Предоставляет функции для открытия или закрытия файла в дополнение к функциям общего потока ввода/вывода
  • fstream– действует на символы типаchar
  • wfstream– действует на символы типаwchar_t
basic_stringstreamпоток ввода/вывода, который оборачивает буфер потока строк. Предоставляет функции для доступа к базовой строке в дополнение к функциям общего потока ввода/вывода
  • stringstream– действует на символы типаchar
  • wstringstream– действует на символы типаwchar_t

Заголовочные файлы

Классы библиотеки ввода/вывода находятся в нескольких заголовках.

  • <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, которые являются двумя typedef для basic_iosопределенного типа символа. basic_iosи ios_baseочень редко используются программистами напрямую. Обычно их функциональность доступна через другие классы, такие как , iostreamкоторые их наследуют. [6] [7]

Typedef-ы

Имяописание
iosудобство typedef для basic_iosработы с символами типаchar
wiosудобство typedef для basic_iosработы с символами типаwchar_t
streamoffподдерживает внутренние операции.
streamposхранит текущую позицию указателя буфера или указателя файла.
wstreamposхранит текущую позицию указателя буфера или указателя файла.
streamsizeопределяет размер потока.

Форматирующие манипуляторы

ИмяОписание
boolalpha/noboolalphaboolуказывает, отображаются ли переменные типа как 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)
определяет нотацию, в которой должно отображаться число с плавающей точкой

Входные/выходные потоки

Потоки ввода/вывода C++ в первую очередь определяются iostream, заголовочным файлом , который является частью стандартной библиотеки C++ (название расшифровывается как Input / Output Stream ). В C++ и его предшественнике, языке программирования C , нет специального синтаксиса для потокового ввода или вывода данных. Вместо этого они объединены в библиотеку функций . Как и заголовок, унаследованный от stdio.h языка C , предоставляет базовые службы ввода и вывода для программ на C++. iostream использует объекты , , , и для отправки данных в и из стандартных потоков ввода, вывода, ошибки (небуферизованные) и журнала (буферизованные) соответственно. Как часть стандартной библиотеки C++ , эти объекты являются частью пространства имен . [8]cstdioiostream cincoutcerrclogstd

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

Форматирование вывода

Методы

width(int x)минимальное количество символов для следующего вывода
fill(char x)символ, используемый для заполнения в случае, когда ширину необходимо увеличить для заполнения минимума.
precision(int x)устанавливает количество значащих цифр для чисел с плавающей точкой

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

Манипуляторы — это объекты, которые могут изменять поток с помощью операторов <<или >>.

endl«end line»: вставляет новую строку в поток и вызывает flush.
ends«end string»: вставляет нулевой символ в поток и вызывает flush.
flushзаставляет выходной поток записывать любые буферизованные символы
wsзаставляет поток ввода «съедать» пробелы
showpointсообщает потоку, что нужно показывать десятичную точку и некоторые нули с целыми числами

Другие манипуляторы можно найти, воспользовавшись заголовком iomanip.

Критика

Манипуляторы форматирования должны быть «сброшены» в конце, иначе программист неожиданно получит их эффект в следующем выходном операторе.

Некоторые реализации стандартной библиотеки C++ имеют значительное количество мертвого кода . Например, GNU libstdc++ автоматически создает локаль при построении, дажеostream если программа никогда не использует какие-либо типы (дата, время или деньги), на которые влияет локаль, [9] а статически связанная программа "Hello, World!" , использующая <iostream>GNU libstdc++, создает исполняемый файл на порядок больше, чем эквивалентная программа, использующая <cstdio>. [10] Существуют частичные реализации стандартной библиотеки C++, разработанные для сред с ограниченным пространством; они <iostream>могут не включать функции, которые программам в таких средах могут не понадобиться, например, поддержку локали. [11]

Соглашения об именовании

Примеры

Каноническую программу «Hello, World!» можно выразить следующим образом:

#include <iostream> int main () { std :: cout << "Привет, мир!" << std :: endl ; }      

Эта программа выведет «Hello, world!», за которым последует новая строка и очистка буфера стандартного потока вывода.

В следующем примере создается файл с именем «file.txt» и в него помещается текст «Hello, world!» с последующим символом новой строки.

#include <fstream> int main () { std :: ofstream file ( "file.txt" ); file << "Привет, мир!" << std :: endl ; }         

Ссылки

  1. ^ ISO/IEC 14882:2003 Языки программирования – C++. [lib.string.streams]/1
  2. ^ Стэнли Б. Липпман, Джози Лажуа (1999). C++ Primer (третье изд.). Массачусетс: Addison-Wesley. стр. 1109–1112. ISBN 0-201-82470-1.
  3. ^ Бьярне Страуструп (1997). Язык программирования C++ (третье изд.). Addison-Wesley. стр. 637–640. ISBN 0-201-88954-4.
  4. ^ Стэнли Б. Липпман, Джози Лажуа (1999). C++ Primer (третье изд.). Массачусетс: Addison-Wesley. стр. 1063–1067. ISBN 0-201-82470-1.
  5. ^ Бьерн Страуструп. «История C++: 1979–1991» (PDF) .
  6. ^ Стэнли Б. Липпман, Джози Лажуа (1999). C++ Primer (третье изд.). Массачусетс: Addison-Wesley. стр. 1112–1120. ISBN 0-201-82470-1.
  7. ^ "<ios> Visual Studio 2010". Microsoft MSDN: Visual Studio 2010. Получено 28 сентября 2011 г.
  8. ^ Хольцнер, Стивен (2001). С++: Черная книга . Скоттсдейл, Аризона: Группа Кориолиса. п. 584. ИСБН 1-57610-777-9. ...endl, который очищает выходной буфер и отправляет новую строку в стандартный поток вывода.
  9. ^ Исходный код GNU libstdc++,bits/ios_base.h
  10. ^ C++ против C – Восьмой контакт
  11. ^ "uClibc++ C++ library" . Получено 6 января 2012 г. .
  • Справочник C++ по библиотеке ввода/вывода
  • Стандартная библиотека Apache C++ Iostreams
  • Подробный учебник по форматированию вывода в C++
Retrieved from "https://en.wikipedia.org/w/index.php?title=Input/output_(C%2B%2B)&oldid=1179941617#Input/output_streams"