Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Управление файлами в языке Си



Цель работы: научиться составлять программы с использованием файлов

Краткие теоретические сведения

В языке Си можно выделить два способа представления файлов:

- в виде потока символов;

- низкоуровневое представление, поддерживаемое непосредственно MS-DOS.

В первом случае каждому открытому файлу ставится в соответствие переменная типа FILE *. Тип данных FILE, а также функции для работы с потоками, описаны в заголовочном файле < stdio.h>. Среда программирования на языке Си поддерживает и автоматически открывает пять стандартных потоков:

stdin;

stdout;

stderr;

stdaux;

stdprn.

 

Во втором случае каждому открытому файлу ставится в соответствие целочисленный идентификатор, или дескриптор. Прототипы функций данной группы, а также используемые константы описаны в файлах < io.h>, < fcntl.h>, < sys/stat.h>.

Основные функции для работы с файлами приведены в таблице 1.

 

Таблица 1 - Основные функции для работы с файлами

Наименование операции Потоковый ввод-вывод Низкоуровневый ввод-вывод
Создание и (или) открытие файла fopen, freopen, fdopen, open, _open, create, _create
Закрытие файла fclose, fcloseall close, _close
Чтение из файла fprintf, fgets, fgetc read, _read
Запись в файл fscanf, fputs, fputc write, _write
Определение текущей позиции в ftell, fgetpos Tell
Наименование операции Потоковый ввод-вывод Низкоуровневый ввод-вывод
Файле    
Позиционирование fseek, fsetpos lseek
Определение конца файла feof eof
Удаление файла unlink

 

Директивы препроцессора #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 - Описание моделей памяти

 

Название Размер сегментов Тип указателей модели
  код данные стек код данные
Tiny (крошечная) 64 K near near
Small (малая) 64 K 64 K near near
Medium (средняя) 1 М   far near
Compact (компактная) 64 K Гм near far
Large (большая) 1 М Гм far far
Huge (огромная) 1 М 64 K I каждый 64 K стек far far

 

Таблица 3 - Описание действия модификаторов

Модификатор Результат применения с указателем Результат применения с функцией
near 16-битный указатель, адресация в пределах сегмента (64 K) " Ближний вызов" (в пределах сегмента)
far 32-битный указатель, содержит адрес сегмента и смещение, адресация в пределах до 1 Мб " Дальний вызов" (межсегментный)
huge Имеет все свойства far, поддерживается в нормализованном виде Аналогично far, поддерживается в нормализованном виде

 

Порядок выполнения работы

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

Методы работы с файлами, тип файлов и их количество определяются номером варианта

Программа должна быть реализована как многомодульная. Имена файлов передаются программе через командную строку как аргументы функции main.

Варианты заданий

 

  потоковый Низкого уровня текстовый двоичный
Номера вариантов 1, 2, 5, 6, 9, 10 3, 4, 7, 8, 11, 12 1 3 5 7 9 11 2, 4, 6, 8, 10, 12
  Номера вариантов Дополнительные условия  
  1, 4, 7, 10 Если имена входного и выходного файлов совпадают, переименовать входной файл, изменив его расширение на bak  
  2, 5, 8, 11 Входной файл является выходным и полностью перезаписывается  
  3, 6, 9, 12 Входной файл является выходным и полностью перезаписывается; на основании старой версии файла формируется ее копия с расширением bak  
               

 

Контрольные вопросы

1. Что такое потоки и файлы в Си?

2. Вывод в файл.

3. Ввод из файла.

4. Что такое модель памяти

5. Как составляются многомодульные программы

 

ЛАБОРАТОРНАЯ РАБОТА №7

 

Графические возможности языка Си

 

Цель работы: Получить практические навыки реализации классов на С++. Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса. Выполнить исследование вызовов конструкторов и деструкторов.

 


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 816; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.023 с.)
Главная | Случайная страница | Обратная связь