Поток inFile класса ifstream в нашем примере присоединяется функцией open() к файлу с именем DATA. TXT. Этот файл открывается для чтения из него данных в текстовом режиме. Если файла с именем DATA. TXT не существует, то попытка вызвать функцию inFile. open() приведет к ошибке.

Для проверки удачности завершения функции ореn() используется следующая конструкция:

if(!inFile)

{ cerr << "Ошибка при открытии файла!\n"; exit(l); }

Для потоков класса fstream второй аргумент функции ореn() должен быть задан явно, так как по умолчанию неясно, в каком направлении предполагается выполнять обмен с потоком.

В классе fstreambase, который служит основой для файловых классов, имеются и другие средства для открытия уже существующих файлов.

Если файл явно создан с помощью библиотечной функции "нижнего уровня" create(), то для него определен дескриптор файла. Этот дескриптор можно использовать в качестве фактического параметра функции fstreambase::attach(). При вызове этой функции используется уточненное имя, содержащее название того потока, который предполагается присоединить к уже созданному файлу с известным дескриптором:

В классах ifstream, ofstream, fstream определены конструкторы, позволяющие по-иному выполнять создание и открытие файлов.

Работая со средствами библиотечных классов ввода-вывода, чаще всего употребляют конструктор без параметров и конструктор, в котором явно задано имя файла. Примеры обращений к конструкторам без параметров:

ifstream fi; // Создает входной файловый поток fi

НЕ нашли? Не то? Что вы ищете?

ostream fo; // Создает выходной файловый поток fo

fstream ff; //Создает файловый поток ввода-вывода ff

После выполнения каждого из этих конструкторов файловый поток можно присоединить к конкретному файлу, используя уже упомянутую компонентную функцию open ():

fi. open("Filel. txt",ioe::in); // Поток fi соединен с файлом Filel. txt        

fi. close(); // Разорвана связь потока fi с файлом Filel. txt

fi. open(“File2.txt”); // Поток fi присоединен к файлу File2.txt

fo. open("NewFile"); // Поток fо присоединяется к файлу NewFile; если такой файл отсутствует - он будет создан

При обращении к конструктору с явным указанием в параметре имени файла остальные параметры можно не указывать, они выбираются по умолчанию.

Примеры:

ifstream flowl("File. l");

создает входной файловый поток с именем flow1 для чтения данных. Разыскивается файл с названием File.1. Если такой файл не существует, то конструктор завершает работу аварийно. Проверка: if (!flowl) cerr << "Не открыт файл File. l!";

ofstream flow2(“File.2”);

создается выходной файловый поток с именем flow2 для записи информации. Если файл с названием File.2 не существует, он будет создан, открыт и соединен с потоком flow2. Если файл уже существует, то предыдущий вариант будет удален и пустой файл создается заново.

fstream flow3("File.3");

создается файловый поток flow3, открывается файл File.3 и присоединяется к потоку flow3.

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

Задание

1. Написать программу, результатом выполнения которой будет постраничный вывод на экран текстового файла, имя которого набирает на клавиатуре пользователь по «запросу» программы. Размер страницы - 20 строк.

Читать пробельные символы позволяет компонентная функция getline() класса ifstream.

2. Написать программу, результатом выполнения которой будет запись в файл информации, набранной с клавиатуры.

Лабораторная работа №9

Тема: «Реализация функций API на уровне ОС»

(2 часа)

При реализации функций API на уровне ОС за их выполнение ответственность несет ОС. Объектный код, выполняющий функции, либо непосредственно входит в состав ОС (или даже ядра ОС), либо поставляется в составе динамически загружаемых библиотек, разработанных для данной ОС. Система программирования ответственна только за то, чтобы организовать интерфейс для вызова этого кода.

В таком варианте результирующая программа обращается непосредственно к ОС. Поэтому достигается наибольшая эффективность выполнения функций API по сравнению со всеми другими вариантами реализации API.

Недостатком организации API по такой схеме является практически полное отсутствие переносимости не только кода результирующей программы, но и кода исходной программы. Программа, созданная для одной архитектуры вычислительной системы, не сможет исполняться на вычислительной системе другой архитектуры даже после того, как ее объектный код будет полностью перестроен. Чаще всего система программирования не сможет выполнить перестроение исходного кода для новой архитектуры вычислительной системы, поскольку многие функции API, ориентированные на определенную ОС, будут в новой архитектуре просто отсутствовать.

Таким образом, в данной схеме для переноса прикладной программы с одной целевой вычислительной системы на другую будет требоваться изменение исходного кода программы.

Переносимости можно было бы добиться, если унифицировать функции API в различных ОС. С учетом корпоративных интересов производителей ОС такое направление их развития представляется практически невозможным. В лучшем случае при приложении определенных организационных усилий удается добиться стандартизации смыслового (семантического) наполнения основных функций API, но не их программного интерфейса.

Хорошо известным примером API такого рода может служить набор функций, предоставляемых пользователю со стороны ОС типа Microsoft Windows – WinAPI (Windows API). Надо сказать, что даже внутри этого корпоративного API существует определенная несогласованность, которая несколько ограничивает переносимость программ между различными ОС типа Windows. Еще одним примером такого API можно считать набор сервисных функций ОС типа MS-DOS, реализованный в виде набора подпрограмм обслуживания программных прерываний.

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

Для работы с файловой системой используются в числе прочих следующие функции API Win32: FindFirstFile(), FindFirstFileEx(), FindNextFile(). Все эти функции работают со структурой WIN32_FIND_DATA. Структура содержит 10 полей:

typedef  struct WIN32_FIND_DATA{

  DWORD dwFileAttributes;

  FILETIME ftCreationTime;

  FILETIME ftLastAccessTime;

  FILETIME ftLastWriteTime;

  DWORD nFileSizeHigh;

  DWORD nFileSizeLow;

  DWORD dwReserved0;

  DWORD dwReserved1;

  CHAR cFileName[MAX_PATH];

  CHAR cAltenateFileName[14];

}

В таблице 1 приведено детальное описание структуры.

Таблица 1.

элемент

Описание

dwFileAttributes

Специфицирует атрибуты файлового объекта. Атрибуты, файла описывают, какой разрешен доступ к нему, файл это или каталог и т. д. Этот  элемент может содержать одно или несколько значений, описанных в таблице 2.

ftCreationTime

Содержит структуру FILETIME (64-битное значение, представляющее число 100-наносекундных интервалов, прошедших с 1-го января 1601 г.), специфицирующую время первоначального создания файла операцион­ной системой. Структура имеет 2 элемента DWORD, которые функции Find устанавливают в 0, если файловая система, содержащая файл, не поддерживает этот элемент.

ftLastAccessTime

Содержит структуру FILETIME, специфицирующую время последнего обращения пользователя к файлу. Как и в случае ftCreationTime, оба ее элемента содержат 0, если файловая система не предусматривает этой информации.

ftLastWriteTime

Содержит структуру FILETIME, специфицирующую время, когда поль­зователем или процессом производилась последняя запись в файл. Как и в случае ftCreationTime и ftLastAccessTime, оба ее элемента содер­жат 0, если файловая система не предусматривает этой информации.

nFileSizeHigh

Размер файла сохраняется операционной системой в двух значениях DWORD, которые комбинируются в соответствии с формулой (nFileSizeHigh * MAXDWORD) + nFileSizeLow, которая дает полный размер файла. (MAXDWORD обычно р но 232-1 .) Данный элемент специфицирует старшую часть paj ла; он равен 0, если только размер файла не больше MAXDW

nFileSizeLow

Специфицирует младшую часть размера файла. Такая структураиз двух DWORD позволяет файлу иметь размер порядка терабайт.

dwReserved0, dwReservedl

Зарезервировано корпорацией Microsoft для будущего использования.

cFileName

Ограниченная нулем строка, содержащая длинное имя файла. Его длина всегда меньше МАХ РАТН, системной константы, равной обычно 255 или 260.

cAlternateFileName

Ограниченная нулем строка, содержащая альтернативное имя. Это имя представлено в классическом формате 8.3 (filename. ext). Используйте этот элемент, если вы не уверены, поддерживает ли каждая функция или система, обращающиеся к файлу, длинные имена.

Как указано в таблице 1, элемент dwFileAttributes может содержать одно или комбинацию из нескольких значений констант, характеризующих свойства файла. Эти константы перечислены и описаны в таблице 2.

Таблица.2. Значения констант для dwFileAttributes

Константа

Описание

FILE_ATTRIBUTE_ARCHIVE

Приложение используют данное значение, чтобы пометить файл для резервного копирования или удаления. Всякий раз, когда файл изменяется, Windows устанавливает архивный бит. Когда программа резервного копирования архивирует файл, она сбрасывает данный бит.

FILE_ATTRIBUTE_COMPRESSED

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

FILE_ATTRIBUTE_DIRECTORY

Файловый объект соответствует каталогу или папке, – т. е. это логический объект операционной системы, не содержащий собственных данных, а служащий инструментом для  организации других объектов.

FILE_ATTRIBUTE_HIDDEN

Файл является скрытым, т. е. он не включается в обычный листинг каталога, этот атрибут обычно используется системными, вспомогательными или другими файлами, которые разработчик приложения хочет защитить от случайного обнаружения.

FILE_ATTRIBUTE_NORMAL

Файл обычный, допускающий чтение/запись, не скрытый и не системный. Короче, это означает, что все другие атрибуты файла не установлены и, таким образом, данное значение действительно только в случае, если используется оно одно.

FILE_ATTRIBUTE_OFFLINE

Данные файла не являются непосредственно доступными. Показывает, что данные были физически перемещены для внешнего хранения. Этот атрибут используется крайне редко, только в некоторых сетевых средах.

FILE_ATTRIBUTE_READONLY

Файл допускает только чтение. Приложения могут его читать, но не могут модифицировать или удалить. Приложение, которому требуется это делать, должно либо обнулить сначала данный бит, либо сохранить файл под другим именем.

FILE_ATTRIBUTE_SYSTEM

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

FILE_ATTRIBUTE_TEMPORARY

Файл используется для временного хранения. Этот атрибут присваивается файлу, если он создается функцией tmpfile() или любой из функций Windows для временных файлов, таких, как tmpnam() и _tempnam() Временные файлы, созданные приложением, не являются «стабильными» – они должны быть стерты приложением при завершении.

Если файл имеет длинное имя, полный его вариант будет находиться в cFileName. API в этом случае возвратит классический (формат 8.3), усеченный его вариант в поле cAlternateFileName. Если операционная сися не поддерживает длинные имена файлов либо в данном случае файл это имя не использует, элемент cAlternateFileName будет пустым, a cFtleName будет содержать имя в формате 8.3. Чтобы получить версию имени _ 8.3, вы можете также вызвать функцию API GetShortPathName(), которая возвращает 12-символьную форматированную строку.

Задание

Изучить функцию FindFirstFile(). Прочитать и вывести на экран атрибуты файла, используя функцию FindFirstFile().

Литература

, «Системное программное обеспечение», М. Питер, 2003 «С/С++ Алгоритмы и приемы программирования», М. БИНОМ, 2003 , «Микропроцессор 80386: как он работает и как работать с ним: Учебное пособие». С.-Пб:Элмор, 1994 «Руководство пользователя ЭВМ: В 2-х ч.» – С.-Пбю: Ассоциация OILCO, 1992 Донован Дж. «Системное программирование» –М.:Мир, 1975 «Справочник программиста персональных компьютеров типа IBM PC XT и AT/ пер. с англ.» –М.:Финансы и статистика, 1991

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5