Принципы организации ввода-вывода данных в С++:
· периферийные устройства ввода-вывода интерпретируются как специальные файлы, поэтому дисковые файлы и устройства ввода-вывода не различаются, и подход к организации обмена данными с ними одинаков;
· файлы интерпретируются как потоки данных: данные читаются из файла и записываются в файл побайтно, посимвольно (потоком); поток с точки зрения программы не зависит от конкретных устройств (файл на диске, принтер, клавиатура);
· средства ввода-вывода обеспечивают программиста механизмом для извлечения данных из потоков и для включения данных в потоки; операция извлечения из потока – 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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.