Jump to content

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

(Перенаправлено с Iostream )

В 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 предоставляет абстрактный низкоуровневый интерфейс ввода/вывода, который можно реализовать для конкретных источников или приемников данных. Редко используется напрямую.
  • 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, которые представляют собой два определения типа для 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)
указывает обозначение, в котором должно отображаться число с плавающей запятой

Потоки ввода/вывода

[ редактировать ]

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;
}
  1. ^ ISO/IEC 14882:2003 Языки программирования – C++. [lib.string.streams]/1
  2. ^ Стэнли Б. Липпман, Жози Лажуа (1999). C++ Primer (третье изд.). Массачусетс: Аддисон-Уэсли. стр. 1109–1112 . ISBN  0-201-82470-1 .
  3. ^ Бьерн Страуструп (1997). Язык программирования C++ (третье изд.). Аддисон-Уэсли. стр. 637–640 . ISBN  0-201-88954-4 .
  4. ^ Стэнли Б. Липпман, Жози Лажуа (1999). C++ Primer (третье изд.). Массачусетс: Аддисон-Уэсли. стр. 1063–1067 . ISBN  0-201-82470-1 .
  5. ^ Бьерн Страуструп. «История C++: 1979–1991» (PDF) .
  6. ^ Стэнли Б. Липпман, Жози Лажуа (1999). C++ Primer (третье изд.). Массачусетс: Аддисон-Уэсли. стр. 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++» . Проверено 6 января 2012 года .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b2dae5662ab082057979345c1a052280__1697191620
URL1:https://arc.ask3.ru/arc/aa/b2/80/b2dae5662ab082057979345c1a052280.html
Заголовок, (Title) документа по адресу, URL1:
Input/output (C++) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)