Файлы. Общая концепция организации ввода-вывода данных в С++. Средства класса ios, обеспечивающие точную настройку вывода, страница 3

·  сами состояния определены в классе ios как целые статические константы, называемые флагами состояния потока (goodbit = 0x00; badbit=0x01; eofbit=0x02; failbit=0x04;); значения флагов зависят от реализации, однако имена одинаковы во всех системах; в программе имена флагов состояния: ios::eofbit; ios::goodbit,  ios::badbit; ios::failbit;  система ввода-вывода С++ предоставляет методы для установки флагов (setstate (ios::eofbit  | ios::failbit ) и для получения информации о состоянии потока (good (), eof(), fail(), bad());

·  состояние потока можно проверить непосредственно в условии if или в цикле while;

·  потоки подразделяют на:

входные и выходные; из входного потока информация считывается (извлекается); в выходной поток данные вводятся; двунаправленный поток реализует чтение и запись;

буферизуемые и небуферизуемые; при обмене с потоком часто используется вспомогательный участок основной памяти – буфер потока; при буферизованном потоке вывод выполняется не на устройство, а в буфер; использование буфера как промежуточной ступени при обменах с внешними устройствами повышает скорость передачи данных, так как реальные пересылки осуществляются только тогда, когда буфер уже заполнен (при выводе) или пуст (при вводе); данные помещаются в буфер, перед тем как они будут переданы к внешнему устройству (при выводе данных) или перед тем, как они будут переданы в область памяти выполняемой программы (см. рис.3.1.); заполненный буфер выводится на устройство, как правило, без непосредственного указания в программе; однако программа может потребовать вывести неполный буфер; при вводе буфер обычно заполняется при выполнении первой операции ввода, но специально программировать это не требуется; обычно буферизация реализуется по умолчанию, но в библиотеках есть средства, позволяющие управлять назначением буферов;

широкие (оперируют широкими символами wchar_t) и узкие (оперируют обычными символами char).

форматируемые и неформатируемые; форматируемость означает, что при операциях ввода-вывода выполняется преобразование информации; при форматированном вводе-выводе («высоком» уровне) байты группируются в значащие элементы данных (целые числа, числа с плавающей запятой, символы, строки, типы, определенные пользователем); т.к. поток – это последовательность символов, при вводе, как правило, выполняется преобразование данных из символьного вида (внешнего представления) в двоичное (внутреннее) представление, а при выводе – наоборот; форматирование, например, всегда выполняется для стандартных потоков;

ввод-вывод на «низком» уровне (бинарный, неформатированный) обычно сводится к пересылке некоторого числа байтов (в этом случае байт является самостоятельным элементом данных); такая пересылка данных имеет высокую скорость, однако, неудобна для программиста; числа при этом вводе-выводе сохраняются во внутреннем представлении; поток, созданный с помощью оператора  <<, представляет из себя поток с отформатированным текстом, и наоборот, поток, содержимое которого считывается с помощью оператора >>, должен быть потоком с отформатированным текстом.

·  средства ввода-вывода С++ могут обеспечить последовательный и прямой доступ к данным, несмотря на то, что в С++ не предусмотрены предопределенные структуры потоков последовательного или прямого доступа; хотя все потоки библиотеки ввода-вывода последовательны (т.е. в каждый момент для потока определены позиции записи и (или) чтения, и эти позиции перемещаются по потоку на длину переданной порции данных) можно некоторым образом разместить данные в потоке так, чтобы организовать прямой доступ к ним; возможность позиционировать указатель внутри файла на требуемую позицию  реализуется с помощью функций  seekg() и seekp(), являющихся соответственно потоковыми функциями ввода и вывода.

Буферизированный              выходной поток

                                                                        Передача при пустом буфере ввода