Лекция 4. Более сложные элементы программирования (1153711), страница 2
Текст из файла (страница 2)
справочную литературу) и strcat.Программирование обработки табличных данных может такжевыполняться с использованием структур, которые рассматриваются вследующем параграфе.3.2. Тип "структура" в СиПока мы рассматривали один вид сложных (занимающих несколько ячеек памяти) данных — массив; одним из основных свойствмассива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащихв себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: платежные ведомости (фамилии и имена символьная информация, денежные суммы - числовая), карточкибольных в поликлинике, библиотечная информация.
Для программи-8рования алгоритмов обработки такой информации необходимо иметьсложный тип, объединяющий разнотипные компоненты. Таким типомявляется структура в Си ( в Паскале запись).Структурная переменная, или просто структура, состоит из нескольких переменных (называемых полями), возможно, разного типа.Структуратип "структура" (шаблон)переменная типа"структура"Описание шаблона:Описание структурнойпеременнойtypedef struct { Тип1 Список1ИменПолей; struct ИмяШаблонаИмяПеременнойТип2 Список2ИменПолей;...ТипN СписокNИменПолей; ключевое struct словоне нужно пpи} ИмяШаблонаиспользовании typedefили struct ИмяШаблона{ Тип1 Список1ИменПолей;¦Тип2 Список2ИменПолей;...ТипN СписокNИменПолей;};Пример.
Характеристики книги: автор (author), название (title),год издания (year), цена (price), описываются шаблоном BOOK.typedef struct {char author[20]; char title[44];/*описание*/int year; float price} BOOK; /*шаблона BOOK*//*или можно описать тот же самый шаблон так:struct BOOK {char author[20]; char title[44];int year; float price} ;*/struct BOOK b;/*описание структурной переменной b*/Память, занимаемая структурой, равна сумме объемов памятиполей (если исключить из рассмотрения особенности, связанные свыравниванием). В любом случае для определения размера памяти9структуры можно использовать операцию sizeof(). Шаблон ВООК, например, описывает структуру размером памяти 70.Обращение к полю структурной переменной:ИмяСтруктуры.ИмяПоля или АдресСтруктуры->ИмяПоля.(точка) и -> являются операциями, соответственно, прямого икосвенного выбора компоненты структурированной переменной.Например,struct BOOK a,*pnta=&a;...a.author="Byron"; pnta->author="Byron"; /*эквивалентные операторы*/Примеры программ с использованием структур рассмотрим после того, как нучимся работать с файлами, так как такие программыобычно связаны с обработкой больших объемов данных.В современном программировании структуры, прежде всего,нужны для объединения компонентов разного типа в одну переменнуюв соответствии с логикой задачи; тем самым, примение структур улучшает восприятие программы.В Си существует еще один сложный тип, описание которогоформально похоже на структуру.
Это тип (и переменная) объединение.Объединение - это переменная, содержащая поля разного типа,помещаемые в одно и то же место памяти. По существу объединениедает способ различной интерпретация содержимого памяти. Описаниешаблона (типа) объединения и переменной этого типа выполняетсятакже, как для структуры, только вместо ключевого слова struct используется union. Размер памяти, занимаемой объединением, равенмаксимальному из размеров полей.3.3.
Файлы в Си3.3.1. Общие понятия.Термин файл используется в программировании в двух смыслах.В рамках операционной системы файл понимается как область памятизапоминающего устройства (обычно диска), имеющая имя. В алгоритмических языках файл - это тип данных, используемый, как правило,10при работе с внешними запоминающими устройствами. В Си нет специального типа файл, но есть предопределенный структурный типFILE, описание которого содержится в заголовочном файле stdio.h.Файл - это последовательность однотипных компонент.Число компонент файла не ограничено. Компонентой файла можетбыть строка или байт, или значение какого-либо типа (целого, вещественного, структура, и т.
д.). После последней компоненты файластоит специальный код, называемый признаком конца файла; этот кодобычно ставится автоматически, без участия программиста.В классическом понимании файл рассматривается как абстрактное обобщение данных на устройстве с последовательным доступом, типичным представителем которого является магнитная лента.В библиотеках современных языков программирования, конечно, имеются средства и для работы с файлами прямого доступа.Абстрактная последовательность данных на некотором внешнемустройстве также называется потоком.Обычно в алгоритмических языках определяется программное ифизическое имя файлов. В Си программное имя - это имя переменной типа FILE*, физическое имя - это имя устройства или файла надиске. Существуют специальные операторы, связывающие программное и физическое имя файла (см.§4.2).Файлы бывают текстовыми и двоичными.Текстовые файлы хранят информацию во внешнем представлении.
Они имеют два основных признака: во-первых, их компонентами являются строки символов; во-вторых, эта символьная информация при чтении из файла или записи в файл преобразуется всоответствии с типом вводимых или выводимых переменных. Этифайлы являются обобщением данных на устройстве CON (т.е. вводимых с клавиатуры или выводимых на экран компьютера).
Умение работать с текстовыми файлами необходимо даже начинающим программистам, так как на устройстве CON данные существуют малыйпромежуток времени, а часто имеется потребность в их длительномхранении.Текстовые файлы можно ввести в ЭВМ, прочитать, исправить спомощью текстового редактора. Они хранят информацию во внешнем11представлении, в виде, понятном для человека. Такие файлы частоназываются видимыми.Двоичный файл - это последовательность байтов; обмен информации между двоичным файлом и переменными программы происходит без преобразования.3.3.2.
Функции Си для работы с файламиШаблон структуры FILE и прототипы основных функций работы сфайлами хранятся в stdio.h. Перед использованием файла необходимо:1. Описать его программное имя как указатель на структуру типаFILE:FILE *ИмяУказателя2. Открыть файл. Функция открытия файла устанавливает связьмежду программным и физическим именами файла и подготавливает его к использованию.Шаблон функции открытия файла:FILE *fopen(char *ИмяФайла, char *режим);первый параметр задает строку, в которой хранится физическоеимя файла, записанное по правилам операционной системы, второй режим открытия.Приведем некоторые режимы:“r” - открыть для чтения;“w” - открыть для записи;rb” - открыть двоичный файл для чтения;“wb” - открыть двоичный файл для записи;“rt” - открыть текстовый файл для чтения;“wt” - открыть текстовый файл для записи;.
“a” – открыть файл для дополнения.Результат функции fopen необходимо присвоить переменной типа FILE *. Если функции fopen удалось открыть указанный файл, возвращается указатель на FILE. Если же файл не может быть открыт,возвращается NULL.Пример открытия файла и обнаружения ошибки при открытии:FILE *fp;12fp=fopen(“x.txt”,”w”);if (fp==NULL)puts(“Ошибка при открытии файла”)else ....Или:FILE *fp;if ((fp=fopen(“x.txt”,”w”))==NULL){ puts(“Ошибка при открытии файла”);exit(1); }.Функция с шаблономint feof(FILE *fp);возвращает значение, не равное 0 (истина), если (при открытиифайла, или чтении из файла, или записи в файл) конец файла достигнут, и значение 0 (ложь) в противном случае.В стандартной библиотеке Си функции ввода-вывода, в частности доступа к файлам, могут возвращать значение, равное символьной константе (точнее макроопределению) EOF для индикации, чтодостигнут конец файла.
Реальное значение EOF является отрицательным числом, зависящим от системы (в основном −1), что гарантирует несовпадение с кодом символа.Далее поясним, что такое открытие файла для чтения, записи идополнения.Открытие файла для чтения предусматривает выполнение следующих действий:1. Поиск файла с заданным физическим именем; если файл ненайден, то выводится сообщение об ошибке.2. Указатель файла устанавливается на первую компоненту.3. Компонента, на которой стоит указатель, считывается в буфер.4.