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

Принципы организации ввода-вывода данных в С++:

·  периферийные устройства ввода-вывода интерпретируются как специальные файлы, поэтому дисковые файлы и устройства ввода-вывода не различаются, и подход к организации обмена данными с ними одинаков;

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

·  средства ввода-вывода обеспечивают программиста механизмом для извлечения данных из потоков  и для включения данных в потоки; операция извлечения из потока –  operator >>; операция вывода в поток – operator <<;

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

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

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

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

·  с потоком связывается внутренний указатель, значение которого задает позицию для выполнения следующей операции чтения или записи;

·  каждый поток (в том числе и стандартный) в каждый момент времени находится в некотором состоянии; эти состояния называются good, bad, fail, eof (end of file);

состояние good означает, что во время предыдущей операции не произошло никаких непредвиденных событий и может быть выполнена следующая операция ввода-вывода, в остальных случаях следующая операция выполнена не будет; состояния fail и bad  являются состояниями ошибки потока; если поток находится в одном из этих состояний, то операции обмена не выполняются;

состояние bad– «тяжелое» состояние, в этом случае лучше завершить выполнение программы; состояние bad включает в себя состояние fail (означает, что операция завершилась неудачно, однако поток не испорчен и никакие символы не потеряны);

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

состояние eof может возникнуть только при операции чтения; для стандартного потока ввода это состояние возникает при нажатии Ctrl+Z; для файлов это состояние устанавливается при первой попытке чтения после последнего байта файла, при этом поток тоже переводится в состояние fail;