С одной стороны, потоки можно разделить на входные и выходные: из входного потока программа данные читает (извлекает, вводит), в выходной поток — пишет (помещает, выводит). С другой стороны, потоки бывают форматируемые и нефор-матируемые, буферизуемые и небуферизуемые, широкие (wide) и узкие (narrow). Широкие потоки оперируют широкими символами wchar_t (см. п. п. С.2.2.1 в [1]), а узкие — обычными символами char.
Форматируемость означает, что при операциях ввода-вывода выполняется преобразование информации. Так как поток — это последовательность символов, при вводе, как правило, выполняется преобразование данных из символьного вида в двоичное представление, а при выводе — наоборот. Форматирование, например, всегда выполняется для стандартных потоков.
Буферизация позволяет еще больше «развязать» программы и устройства. Если поток буферизован, то вывод выполняется не на устройство, а в специально выделяемую область памяти — буфер. Заполненный буфер выводится на устройство, как правило, без непосредственного указания в программе. Однако программа может потребовать вывести неполный буфер. При вводе программа тоже имеет дело с буфером, а не с устройством, то есть данные в программу попадают из буфера. Буфер обычно заполняется при выполнении первой операции ввода, но специально программировать это не требуется. Обычно буферизация реализуется по умолчанию, но в библиотеках есть средства, позволяющие управлять назначением буферов. Схема ввода-вывода с буферизацией изображена на рис. 14.1.
Внешний источник информации
Рис. 14.1. Буферизация ввода-вывода
Библиотека предоставляет программисту ряд классов (см. листинг 14.1), которые реализуют три вида потоков: стандартные, строковые и файловые потоки. Стандартные потоки бывают только однонаправленными: либо информация только читается из потока, либо — только пишется в поток. А вот файловые потоки могут быть и двунаправленными: из потока можно вводить информацию и в тот же поток — выводить. И это естественно, так как файловые потоки обычно связываются с файлами на диске. Объектно-ориентированные строковые потоки позволяют работать и с символьными массивами, и со строками типа string. В отличие от потоков библиотеки <cstdi о>, эти потоки также могут быть двунаправленными.
Стандартные потоки обозначаются именами, определенными в стандарте, которые нельзя использовать в другом смысле. Эти имена «привязаны» к стандартным устройствам: клавиатуре и экрану, хотя есть возможности перенаправить стандартные потоки на другие устройства. Кроме того, стандартные потоки — форматируемые, среди них есть как буферизуемые, так и не буферизуемые. |