Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Управление файлами в языке Си ⇐ ПредыдущаяСтр 6 из 6
Цель работы: научиться составлять программы с использованием файлов Краткие теоретические сведения В языке Си можно выделить два способа представления файлов: - в виде потока символов; - низкоуровневое представление, поддерживаемое непосредственно MS-DOS. В первом случае каждому открытому файлу ставится в соответствие переменная типа FILE *. Тип данных FILE, а также функции для работы с потоками, описаны в заголовочном файле < stdio.h>. Среда программирования на языке Си поддерживает и автоматически открывает пять стандартных потоков: stdin; stdout; stderr; stdaux; stdprn.
Во втором случае каждому открытому файлу ставится в соответствие целочисленный идентификатор, или дескриптор. Прототипы функций данной группы, а также используемые константы описаны в файлах < io.h>, < fcntl.h>, < sys/stat.h>. Основные функции для работы с файлами приведены в таблице 1.
Таблица 1 - Основные функции для работы с файлами
Директивы препроцессора #undef, #if, #else, #elif, #endif, #ifdef, #ifndef Директива препроцессора #undef по своему действию противоположна директиве #define: она отменяет описания символических констант и макроопределений, сделанные ранее с помощью #define. Пример использования: #define MY_CONST 1 //Теперь MY_CONST соответствует 1 #undef MY_CONST //Отменить описание MY_CONST
Директивы #if, #ifdef, #ifndef, #else, #elif, #endif являются директивами условной компиляции. Общее описание применения директив #if, #else, #endif: #if константноевыражение #else #endif
Компилятор будет обрабатывать только строки, которые следуют за директивой #if до #else в случае, когда константное выражение имеет ненулевое значение. В противном случае компилятор пропускает следующие за #if строки, пока не встретит директивы #else или #endif. Если имеется директива #else, то компилируются строки между #else и #endif. Директива #if может быть вложенной, но соответствующие ей директивы #else и #endif должны быть в том же файле, что и #if. Директива #elif аналогична #else, за исключением того, что альтернативный блок строк транслируется в том случае, когда выражение после #elif является ненулевым. Директивы #ifdef и #ifndef аналогичны #if, применяются для факта определения идентификатора с соответствующим именем с помощью директивы #define. Если таковой идентификатор был определен, то результатом для директивы #ifdef будет 1. Для #ifndef аналогичный результат соответствует случаю, когда идентификатор не был определен. Пример использования #ifndef приведен ниже. Многомодульные программы. Проект Особенностью разработки многомодульных программ на языках Си и является то, что интерфейсная часть модуля и реализация, как правило, отделены друг от друга и хранятся в разных файлах. Интерфейсные части модулей, включающие в себя прототипы функций, описания констант и глобальных переменных, макроопределения, хранятся в так называемых заголовочных (header) файлах, имеющих расширение *.h или *.hpp (для языка ^++). Проект представляет собой план построения многомодульной программы. Он содержит список модулей, из которых состоит программа, имена и месторасположение подключаемых библиотек, опции настройки компилятора, используемые для данной программы. Проект хранится в отдельном файле с расширением *.prj. Для создания, загрузки или закрытия проекта используется пункт Project главного меню. Вызов окна просмотра и редактирования проекта осуществляется пунктом Window, Project главного меню. Пример:
// // Заголовочный файл my.h (интерфейс модуля) #ifndef _MY_ // Предотвращение дублирования имен #define _MY_ extern int MyVariable; //глобальная переменная void func (float, float); #endif // // Файл my.c (реализация модуля) #include < stdio.h> #include < io.h> #include < fcntl.h> #include < sys/stat.h> int MyVariable; void func (float a, float b) { int handle, q; // Дескриптор if handle=open(" f.txt", O_CREAT|O_TRUNC|O_TEXT|O_RDWR, S_IREAD|S_IWRITE))==-1) { printf (" \n Файл f.txt не открылся! " ); return; } if (a> b) write (handle, & a, sizeof(a)); else write (handle, & b, sizeof(b)); close (handle); } // // Обращение к функции и переменной из главного модуля // chief.c #include < stdio.h> // Стандартный файл #include " my.h" // h-файл, созданный прикладным программистом void main () { FILE *in; float var; if ((in=fopen(" s.txt", " rt" ))==NULL) { printf (" \n Файл s.txt не открылся! " ); return; } fscanf (in, " %f^', & var); fclose (in); MyVariable=67; func (MyVariable, var); } Модели памяти Модель памяти определяет метод адресации, используемый по умолчанию, а также количество и размер сегментов, из которых состоит программа. Описание моделей памяти приведено в таблице 2. Модификаторы near, far, huge Модификаторы данной группы применяются с указателями и функциями и могут изменить способ адресации, по умолчанию принятый в данной модели. Описание действия модификаторов приведено в таблице 3. Преимуществом указателей huge является возможность корректного выполнения операций сравнения и арифметических операций над указателями, в том числе и при переходе указателя через границу сегмента в результате увеличения.
Таблица 2 - Описание моделей памяти
Таблица 3 - Описание действия модификаторов
Порядок выполнения работы Модифицировать программу, разработанную в предыдущей лабораторной работе, добавив в нее две функции. Первая функция вызывается в начале работы программы и формирует список на основании данных, хранящихся во входном файле. Вторая функция выполняется перед выходом из программы и производит запись информации из списка в выходной файл. Методы работы с файлами, тип файлов и их количество определяются номером варианта Программа должна быть реализована как многомодульная. Имена файлов передаются программе через командную строку как аргументы функции main. Варианты заданий
Контрольные вопросы 1. Что такое потоки и файлы в Си? 2. Вывод в файл. 3. Ввод из файла. 4. Что такое модель памяти 5. Как составляются многомодульные программы
ЛАБОРАТОРНАЯ РАБОТА №7
Графические возможности языка Си
Цель работы: Получить практические навыки реализации классов на С++. Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса. Выполнить исследование вызовов конструкторов и деструкторов.
|
Последнее изменение этой страницы: 2017-04-12; Просмотров: 858; Нарушение авторского права страницы