
- •Московский государственный социальный университет академия информатики и информационных технологий
- •Введение
- •Часть. Основы программирования на Си
- •1.1. Структура простейшей Си-программы
- •1.2. Данные в Си и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных в Си
- •1.2.3. Правила записи констант в Си
- •1.2.4. Описание переменных и именованных констант в Си.
- •1.2.5. Выражения в Си
- •1.3. Операторы преобразования данных
- •1.3.1. Общие положения
- •1.3.2. Функция форматного выводаprintf()
- •1.3.3. Функция форматного вводаscanf()
- •1.4. Разработка программ на Си
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Си.
- •1. Следование
- •2. Разветвление (развилка)
- •If (условие)
- •If (условие)
- •3. Цикл
- •1.4.4. Примеры разработки программ
- •1.5. Массивы и указатели
- •1.5.1. Понятие массива. Основные правила работы с массивами в Си
- •1.5.2. Примеры программ с массивами.
- •1.5.3. Инициализация массивов
- •1.5.4. Указатели в Си10
- •1.5.5. Связь массивов с указателями в Си
- •Часть. Функции и многофайловые программы в Си
- •2.1. Общие сведения о подпрограммах и функциях
- •2.2. Функции си
- •2.2.1. Описание функции
- •2.2.2. Обращение к функции
- •2.2.3. Место описания функции в программе
- •2.2.4. Примеры программ, использующих функции
- •2.3. Краткие сведения о препроцессоре Си
- •2.3.2.Директива макроопределения #define
- •2.3.3. Директива #include включения файлов
- •2.3.4. Директивы условной компиляции
- •2.415. Многофайловые си-программы
- •2.4.1. Структура программы на Си. Область действия переменных
- •2.4.2. Время жизни и класс памяти переменных
- •Описатели класса памяти
- •2.4.3 Понятие о файле проекта
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации на Си
- •3.1.1. Символьный тип
- •3.1.2. Работа со строками символов в Си. Строковые литералы. .
- •3.1.3. Функции и макросы для работы с символьной информацией
- •3.1.4. Примеры программ
- •3.2. Тип "структура" в Си
- •Структура
- •3.3. Файлы в Си
- •3.3.1. Общие понятия.
- •3.2.Функции Си для работы с файлами
- •3.3.3. Примеры программ, использующих файлы
- •Литература
- •Содержание
3.3. Файлы в Си
3.3.1. Общие понятия.
Термин файл используется в программировании в двух смыслах. В рамках операционной системы файл понимается как область памяти запоминающего устройства (обычно диска), имеющая имя. В алгоритмических языках файл - это тип данных, используемый, как правило, при работе с внешними запоминающими устройствами. В Си нет специального типа файл, но есть предопределенный структурный тип FILE, описание которого содержится в заголовочном файлеstdio.h.
Файл- это последовательность однотипных компонент.Число компонент файла не ограничено. Компонентой файла может быть строка или байт. После последней компоненты файла стоит специальный код, называемый признаком конца файла; этот код обычно ставится автоматически, без участия программиста.
В классическом понимании файл рассматривается как абстрактное обобщение данных на устройстве с последовательным доступом, типичным представителем которого является магнитная лента. В библиотеках современных языков программирования, конечно, имеются средства и для работы с файлами прямого доступа.
В Си абстрактная последовательность данных на некотором внешнем устройстве также называется потоком.
Обычно в алгоритмических языках определяется программное и физическоеимя файлов. В Си программное имя - это имя переменной типаFILE*, физическое имя - это имя устройства или файла на диске. Существуют специальные операторы, связывающие программное и физическое имя файла.
Файлы бывают текстовыми идвоичными.
Текстовые файлы хранят информациюво внешнем представлении. Они имеют два основных признака: во-первых, их компонентами являются строки символов; во-вторых, эта символьная информация интерпретируется в соответствии с типом вводимых или выводимых переменных. Эти файлы являются обобщением данных на устройствеCON (т.е. вводимых с клавиатуры или выводимых на экран компьютера). Умение работать с текстовыми файлами необходимо даже начинающим программистам, так как на устройствеCON данные существуют малый промежуток времени, а обычно имеется потребность в их длительном хранении.
Текстовые файлы можно ввести в ЭВМ, прочитать, исправить с помощью текстового редактора. Они хранят информацию во внешнем представлении, в виде, понятном для человека. Такие файлы часто называются видимыми.
Двоичный файл- это последовательность байтов; обмен информации между двоичным файлом и переменными программы происходит без преобразования.
3.2.Функции Си для работы с файлами
Шаблон структуры FILE и прототипы основных функций работы с файлами хранятся в stdio.h. Перед использованием файла необходимо:
1. Описать его программное имя как указатель на структуру типа FILE:
FILE *ИмяУказателя
Открыть файл. Функция открытия файла устанавливает связь между программным и физическим именами файла и подготавливает его к использованию. Шаблон функции открытия файла: FILE *fopen(char *ИмяФайла, char *режим);
первый параметр задает строку, в которой хранится физическое имя файла, записанное по правилам MS DOS, второй - режим открытия.
Приведем некоторые режимы:
“r” - открыть для чтения;
“w” - открыть для записи;
rb” - открыть двоичный файл для чтения;
“wb” - открыть двоичный файл для записи;
“rt” - открыть текстовый файл для чтения;
“wt” - открыть текстовый файл для записи.
Результат функции fopen необходимо присвоить переменной типаFILE *.
Пример открытия файла и обнаружения ошибки при открытии:
FILE *fp;
fp=fopen(“x.txt”,”w”);
if (fp==NULL)
puts(“Ошибка при открытии файла”)
else ....
Или:
FILE *fp;
if ((fp=fopen(“x.txt”,”w”))==NULL)
{ puts(“Ошибка при открытии файла”);
exit(1); }.
После окончания работы с файлом его необходимо закрыть. Под закрытием файла понимается его сохранение, перерегистрация в каталоге и разрушение установленной при открытии связи между программным и физическим именами файла.
Шаблон функции закрытия файла:
int fclose(FILE * f) - возвращает значение нуль, если операция закрытия прошла успешно.
Функция с шаблоном
int feof(FILE *fp) - возвращает значение, не равное 0 (истина), если конец файла достигнут, и значение 0 (ложь) в противном случае. Существует также константа EOF (End Of File - конец файла), хранящая значение кода конца файла; этот код может быть разным для различных систем программирования.
Рассмотренные ранее функции scanf, printf, puts, gets имеют аналоги для работы с текстовыми файлами. Их названия получаются добавлением справа буквыf к именам упомянутых функций.
Шаблоны функций файлового форматного вывода и ввода:
int fprintf(програм_имя_ файла, форматная_строка, список_вывода);
int fscanf(програм_имя_ файла, форматная_строка, список_вывода);
Шаблоны функций fputs и fgets:
char *fgets(char *string, int nmax,FILE *f)
char *fputs(char *string, FILE *f)
где string - адрес начала вводимого массива символов,
f - указатель на текстовый файл,
nmax - максимальная длина вводимой строки плюс 1.
Функции putc (записать символ в поток) иgetc (прочитать символ из потока) работают как с текстовыми, так и с двоичными файлами. Их шаблоны:
int putc(int ch, FILE* f) (если оператор выполнен успешно, то возвращается записанный символ, иначе EOF)
int getc(FILE *f) (если считывание не выполнено, то EOF)
Для работы с двоичными файламипредназначены функции чтения и записи блоков:
unsigned fread(void *buf, int zap, int n,FILE *f)
unsigned fwrite(const void *buf, int zap, int n,FILE *f)
где buf - указатель на область памяти, с которой будет происходить обмен информацией, zap - длина записи, n - число считанных (записанных) записей, f - указатель на файл.