|
Программирование >> Структурное программирование
Когда данные-элементы объекта выводятся в файл на диске, мы теряем, в известном смысле, информацию о типе объекта. Мы имеем только данные на диске, но не имеем информацию о типах этих данных. Если программе, которая собирается считывать эти данные, известно, какому типу объекта они соответствуют, тогда данные просто читаются в объект этого типа. Интересная проблема возникает, когда мы храним объекты разных типов в одном и том же файле. Как мы можем различать их (или совокупность данных-элементов), когда мы их читаем в программе? Проблема, конечно, состоит в том, что объекты обычно не имеют полей типов (более детально это было рассмотрено в главе 9, Виртуальные функции и полиморфизм ). Один из подходов, который может быть использован для перегруженной операции вывода, это выводить перед каждой совокупностью данных-элементов, представляющих один объект, код типа. Тогда объект ввода будет всегда начинать с чтения поля кода типа и при помощи оператора switch вызывать соответствующую перегруженную функцию. Хотя этому решению не достает элегантности полиморфного программирования, оно обеспечивает работоспособный механизм для сохранения объектов в файлах и их извлечения по мере необходимости. Резюме Все элементы данных, обрабатываемые компьютером, сводятся к комбинациям нулей и единиц. Наименьший элемент данных в компьютере может принимать значения О, либо 1. Такой элемент данных называется битом. Цифры, буквы и специальные символы называются символами. Множество всех символов, используемых для написания программ и представления элементов данных на конкретном компьютере, называется набором символов компьютера. Каждый символ в компьютерном наборе представляется как совокупность из восьми нулей и единиц (называемом байтом). Поле - это группа символов (или байтов), имеющая некоторый смысл. Запись - это группа связных полей. По крайней мере одно поле в записи выбирается в качестве ее ключа для идентификации записи как однозначно соответствующей определенному человеку или сущности, то есть делает ее уникальной среди других записей в файле. Последовательный доступ - наиболее распространенный метод доступа к данным в файле. Совокупность программ, предназначенных для создания баз данных и управления ими, называется системой управления базой данных - СУБД. В C-f-f- каждый файл рассматривается как последовательный поток байтов. Каждый файл завершается некоторым машинно-зависимым маркером конца файла. Потоки обеспечивают каналы связи между файлами и программами. Для осуществления ввода-вывода файлов в С-Н- в программу должны быть включены заголовочные файлы <iostream.h> и <fstream.h>. Файл <fstream.h> включает определения классов потоков ifstream, ofstream и fstream. Файлы открываются просто путем обращения к объектам классов ifstream, ofstream и fstream. В С++ не предъявляется никаких требований к структуре файла. Таким образом, в С++ не существуют понятия, вроде записи . Программист должен подбирать структуру файла, исходя из требований, предъявляемых конкретным приложением. Файлы открываются на вывод путем создания объекта класса ofstream. Этому объекту передаются два аргумента: имя файла и режим открытия файла. Для объекта класса ofstream режим открытия файла может быть либо ios::out - для вывода данных в файл, либо ios::app - для присоединения данных в конец файла. Существующие файлы, открываемые в режиме ios::out, усекаются - вся информация в них теряется. Несуществующие файлы создаются. Функция-операция operator! - элемент класса ios, возвращает ненулевое значение (истина), если либо failbit, либо badbit были установлены при выполнении для потока операции open. Функция-операция operator void * - элемент класса ios преобразует поток в указатель, который можно сравнивать с О (нулевым указателем). Если либо failbit, либо badbit были установлены для потока, то возвращается О (ложь). Программы могут не обрабатывать никаких файлов, либо обрабатывать один или несколько файлов. Каждый файл имеет уникальное имя и связан с соответствующим объектом файлового потока. Все функции по обработке файлов должны ссылаться на файл через соответствующий объект. Указатель get показывает позицию в файле, из которой производится последующий ввод, а указатель put показывает позицию в файле, в которую разместятся следующие выходные данные. Как класс istream, так и класс ostream имеют функции-элементы для позиционирования указателя позиции файла. Этими функциями являются функция-элемент seekg ( seek get ) для класса istream и функция-элемент seekp ( веек put ) для класса ostream. Функции-элементы tellp и tellg возвращают текущие позиции соответственно указателей put и get . Удобным средством при разработке файлов произвольного доступа является применение записей только фиксированной длины. Используя этот метод, программа может быстро определить точное местоположение записи относительно начала файла. Данные могут быть помещены в файл произвольного доступа без разрушения других данных в файле. Данные могут быть обновлены или удалены без перезаписи всего файла. Функция-элемент write класса ostream выводит в указанный поток некоторое число байтов, начиная с заданной позиции в файле. Когда Глава 14 поток связан с файлом, то данные записываются, начиная с позиции, определенной указателем put . Функция-элемент read класса istream вводит некоторое число байтов из указанного потока в область памяти, начиная с заданного адреса. Байты берутся из потока, начиная с позиции, определенной указателем get . Функция write ожидает первый аргумент типа char *, так что этот аргумент должен быть приведен к типу char *, если он является указателем другого типа. Второй аргумент является целым и задает число байтов, которые должны быть записаны. Выполняемая на этапе компиляции унарная операция sizeof возвращает размер в байтах объекта, указанного в круглых скобках; операция sizeof возвращает целое без знака. Функция-элемент read класса istream вводит в объект заданное число байтов из указанного потока; функция-элемент read ожидает первый аргумент типа char *. Функция-элемент eof класса ios определяет, достигнут ли признак конца файла в заданном потоке. Признак конца файла устанавливается, когда попытка считывания данных оканчивается неудачей. В С-Н- имеются средства ввода-вывода для ввода в массивы символов в памяти и вывода из массивов символов в памяти. Эти средства часто называются форматированным вводом-выводом в память или обработкой потоков строк. Ввод из массива символов поддерживается классом istrstream. Вывод в массив символов поддерживается классом ostrstream. Класс istrstream является производным от класса istream. Класс ostrstream производным от класса ostream. Программы, которые используют форматированный ввод-вывод в память, должны включать заголовочный файл <strstream.h> в дополнение к заголовочному файлу <iostream.h>. Применение объекта класса ostrstream может быть реализовано двумя способами. При первом способе объекту класса ostrstream передается динамически размещаемый массив символов, в который осуществляется вывод. Когда вывод в объект класса ostrstream завершен, этот объект может быть заморожен с помощью функции-элемента str. Функция-элемент str возвращает указатель типа char * на начало массива в памяти. Второй путь использования объекта класса ostrstream - передача его конструктору трех аргументов: массива символов, размера этого массива и режима открытия файла (ios::out или ios::app). Данные выводятся в заданный массив. Если задан режим ios::app, то массив символов должен быть строкой, заканчивающейся нулевым символом и вставка данных начинается с этого нулевого символа, но ограничивается размером массива. Объект класса istrstream вводит данные из массива символов в памяти в переменные программы. Нулевой завершающий символ интерпретируется как конец файла.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |