Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Структуры. Битовые поля в структурах.↑ ⇐ ПредыдущаяСтр 4 из 4 Содержание книги
Поиск на нашем сайте
Язык С допускает использование в структурах особого типа полей так называемых битовых полей. Поле битов – это группа соседних (двоичных) разрядов (бит), расположенных в области памяти переменной целого типа. Использование данных полей делает возможным доступ к отдельным битам более крупных объектов, например, байтов или слов. Целесообразно использование полей бит в том случае, когда для хранения информации в структуре данных достаточно несколько бит. Общий синтаксис описания битового поля: тип [имя]: ширина; Поле Тип: в С для определения битового поля разрешено использовать любой тип, интерпретируемый как целый: char, short, int, long (с модификаторами signed, unsigned), перечисления. Поле Ширина: каждому полю выделяется столько бит, сколько указано в поле ширина. Данное выражение должно иметь неотрицательное целое значение. Поле Имя: ссылка на битовое поле выполняется по имени. Если имя в данном поле не указано, то запрошенное количество бит будет отведено, но доступ к ним будет невозможен. Объявление структуры, содержащей поля бит имеет следующий вид:
struct имя_структуры { тип [имя1]: ширина; тип [имя2]: ширина; тип [имяN]: ширина; };
Пример объявления шаблона и определения переменных:
struct bitfld { signed a:1; unsigned b:2; int:4; int c:4; int:0; } bt1, bt2;
Объединения. Объединение – это особый тип данных языка С, называемый составным типом. Фактически объединение – это переменная, которая позволяет в разные моменты времени хранить значения различных типов. Объединение может содержать и структурные переменные. Особенностью объединения является то, что все данные, включенные в объединение, в памяти располагаются с одного и того же адреса, т.е. они перекрывают друг друга. Таким образом, в отдельный момент времени объединение может хранить значение только одного типа из описанного набора, следовательно, значение текущего элемента объединения теряется, когда присваивается значение другому элементу объединения. Итак, ссылаться в данный момент времени можно только на один элемент и, соответственно, только на один тип данных. Задача программиста – обеспечить, чтобы на данные, хранящиеся в объединении, ссылались, как на данные соответствующего типа. Объединения обычно являются частью структуры. Отдельные данные, входящие в объединение называются полями. Перечисления. Перечисление — это набор именованных целых констант. Перечисления довольно часто встречаются в повседневной жизни. Вот, например, перечисление, в котором приведены названия монет, используемых в Соединенных Штатах: penny (пенни, монета в один цент), nickel (никель, монета в пять центов), dime (монета в 10 центов), quarter (25 центов, четверть доллара), half-dollar (полдоллара), dollar (доллар) Перечисления определяются во многом так же, как и структуры; началом объявления перечислимого типа служит ключевое слово enum. Перечисление в общем виде выглядит так: enum тег { список перечисления } список переменных;Здесь тег и список переменных не являются обязательными. (Но хотя бы что-то одно из них должно присутствовать.) Следующий фрагмент кода определяет перечисление с именем coin (монета): enum coin { penny, nickel, dime, quarter, half_dollar, dollar};Тег перечисления можно использовать для объявления переменных данного перечислимого типа. Вот код, в котором money (деньги) объявляется в качестве переменной типа coin: enum coin money;С учетом этих объявлений совершенно верными являются следующие операторы: money = dime;if(money==quarter) printf("Денег всего четверть доллара.\n");Главное, что нужно знать для понимания перечислений — каждый их элемент представляет целое число. В таком виде элементы перечислений можно применять везде, где используются целые числа. Каждому элементу дается значение, на единицу большее, чем у его предшественника. Первый элемент перечисления имеет значение 0. Поэтому, при выполнении кода printf("%d %d", penny, dime);на экран будет выведено 0 2. Работа с файлами. Потоки. Буфер. Файл. Файл – это именованная совокупность данных, хранящаяся на каком-либо носителе (дискета, винчестер, CD), и имеющая определённые атрибуты. 1) Текстовые файлы. 2) Бинарные файлы. Т.ф. рассматриваются как строки, состоящие из непробельных символов, разделённых пробельными символами. Каждая строка заканчивается символом конца строки. Пробельные символы: - пробел \n \t \v \f \r Потоки Абстрактный канал связи, который создаётся в программе для обмена данными с реальными физическим устройством(файлом). Поток создаётся в момент открытия файла. Некоторые потоки создаются автоматически. По направлению передачи, потоки бывают 1)входной(input) 2)выходной(output) 3) двунаправленный(i/o) По способу создания: 1) Автоматически создаваемые потоки, которые связаны со стандартными системными устройствами в\в. Stdin, stdout, stderr, printf, scanf 2) явно создаваемые потоки (для обмена данными с файлом) 3) явно создаваемые потоки для обмена данными со строкой в RAM. Буфер При работе с потоками различают буферизированный и небуферизированный в/в. Buffer – область оперативной памяти, которую используют средства в/в для промежуточного хранения данных, передаваемых между программой и устройством. Системный и программный буфер. Библиотека stdio. Связь с файлами. Открытие и закрытие файла. Перед работой с файлом его необходимо открыть. Для этого используется функция fopen(), которая при успешном открытии возвращает указатель на структуру типа FILE, называемый указателем на файл. Как было сказано ранее, эта структура связана с физическим файлом и содержит всю необходимую информацию для работы с файлом. Возвращаемое функцией значение нужно сохранить и использовать для ссылки на открытый файл. Если произошла ошибка при открытии файла, то возвращается NULL. Функция открытия файла fopen() содержит два параметра, оба являются строковыми литералами: FILE * fopen(char *filename, char *mode); Первый задает физическое местонахождение (путь) и имя открываемого файла, а второй – тип доступа к файлу (режим открытия файла), который может принимать следующие значения:
К комбинациям вышеперечисленным литералов могут быть добавлены также “t” и “b”. “t” – открыть файл в текстовом режиме. “b” – открыть файл в бинарном (двоичном) режиме. Библиотека stdio. Текстовые файлы – чтение и запись. Чтение и запись в файл последовательного доступа Данные хранятся в файлах для того, чтобы их можно было в случае необходимости извлечь и обработать. Для работы с файлами в библиотеке языка С содержится множество функций. Рассмотрим самые распространенные: fprintf(), fscanf(), fgets(), fputs(). Формат параметров этих функций очень похож на формат функций printf(), scanf(), gets(), puts(). Схожи не только параметры, но и действия. Отличие состоит лишь в том, что printf() и другие работают по умолчанию с консолью (экран, клавиатуры), а fprintf(), fscanf(),fgets(), fputs() – с файлами (в том числе и со стандартными потоками stdin – стандартный поток ввода, stdout – стандартный поток вывода), поэтому у них добавлен параметр, являющийся указателем на структуру FILE. Итак fprintf() – это функция форматированного вывода из файла, а fscanf() – функция форматированного ввода в файл. int fprintf(FILE *f, const char форматированная_строка, …); int fscanf(FILE *f, const char форматированная_строка, …); Пример: #include<stdio.h> void main() { int a; FILE *f; if(!(f= fopen(“readme.txt”, “r+t”))) { printf(“Невозможно открыть файл”); return; } for(a=0;a<100;a+=3) fprintf(f, “%d”,a); fcloce(f); } int fputs(char *string, FILE *f); Функция fseek() Каждый открытый файл имеет так называемый указатель на текущую позицию. Все операции над файлами (чтение и запись) работают с данными с этой позиции. При каждом выполнении функции чтения или записи указатель смещается на количество прочитанных или записанных байт. В этом случае, как говорилось ранее, осуществляется последовательный доступ к данным. Но иногда необходимо читать и писать данные в произвольном порядке, что достигается путем установки указателя на некоторую заданную позицию в файле функцией fseek(). int fseek(FILE *f, long int offset, int whence); Параметр offset задает количество байт, на которое необходимо сместить указатель соответственно параметру whence, в файле на который указывает f. Параметр whence может принимать следующие значения, указывающих место в файле, с которого начинается поиск: SEEK_SET – смещение (поиск) выполняется от начала файла. SEEK_CUR – смещение выполняется от текущей позиции указателя. SEEK_END – смещение выполняется от конца файла. Эти символические константы (макроопределения) определены как целочисленные значения. Константе SEEK_SET соответствует 0, SEEK_CUR – 1, SEEK_END -2. Величина смещения может быть как положительной, так и отрицательной, но нельзя сместиться за пределы файла.
|
||||||||||||||||
Последнее изменение этой страницы: 2016-04-08; просмотров: 447; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.171.136 (0.007 с.) |