Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
20_04_13_FAJLY_20-04.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
145 Кб
Скачать
☆

Присваивание структур

Информация, содержащаяся в одной структуре, может быть присвоена другой структуре того же типа с помощью одиночного оператора присваивания,

#include <stdio.h> int main(void) { struct { int a; int b; } x, y; x.a = 10; x.b = 20; у = x; /* присвоение одной структуры другой */ printf ("Contents of у: %d %d.", y.a, y.b); return 0; }

Массивы структур

Возможно, наиболее часто структуры используются в виде массивов структур.

Для объявления массива структур следует сначала определить структуру, а затем объявить массив переменных данного типа.

Например, для объявления 100-элементного массива структур типа addr следует написать: struct addr addr_info[100]; В результате получаем набор из 100 переменных, устроенных, как объявлено в типе структуры addr.

Для доступа к отдельным структурам массива adar_info следует проиндексировать имя массива. printf("%ld", addr_info[2].zip);

Как и массивы переменных, массивы структур индексируются с нуля.

Объявление указателя на структуру

Указатели на структуру объявляются путем помещения * перед именем структурной переменной. Например, предполагая, что ранее была определена структура addr, следующая строка объявляет addr_pointer как указатель на данные этого типа: struct addr *addr_pointer;

Использование указателей на структуру

Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Пусть имеется следующий фрагмент struct bal { float balance; char name[80]; } person; struct bal *p; /* объявление указателя на структуру */ тогда p = &регson; помещает адрес структуры person в указатель р.

Для доступа к членам структуры с помощью указателя на структуру следует использовать оператор "стрелка".

Оператор "стрелка", ->, образован из знака "минус" и символа "больше". Например, для доступа к члену balance с помощью p следует написать: p->balance

Потоки и файлы

Поток - логическое устройство

Существует два типа потоков: текстовые и двоичные.

Текстовые потоки

Текстовые потоки - это последовательность символов.

В текстовых потоках некоторые символы могут преобразовываться.

Например, символ новой строки может преобразовываться в пару «возврат каретки - перевод строки».

Двоичные потоки

Двоичный поток - это последовательность байт, имеющих однозначное соответствие с байтами во внешнем устройстве (нет преобразования символов)

Файлы

файлы - это логическая концепция

Поток связывается с конкретным файлом с помощью операции открытия.

Если файл открыт, может осуществляться обмен между файлом и программой

Связь потока с файлом уничтожается с помощью операции закрытия.

Для файлового ввода-вывода посредством стандартных библиотечных функций ввода-вывода необходимо выполнить следующие шаги:

  1. Подключить файл заголовков, используя следующую директиву препроцессора #include <stdio.h>.

  2. Объявить указатель на структуру FILE для каждого файла.

  3. Открыть файл, используя функцию fopen().

  4. Использовать функции чтения-записи стандартного ввода-вывода.

  5. Закрыть файл, используя функцию fclose().

В начале работы программы открыты пять предопределенных текстовых потоков: stdin, stdout, stderr, stdaux и stdprn.

Поток

Устройство

stdin stdout stderr stdaux stdprn

Клавиатура Экран Экран Первый последовательный порт Принтер

Первые три определены стандартом ANSI С

Каждый поток, ассоциированный с файлом, имеет структуру управления файлом типа FILE.

Данная структура определена в заголовочном файле stdio.h.

Поименованные константы из файла stdio.h. Значения указанных констант зависят от реализации.

Константа

Смысл константы

EOF

признак конца файла

NULL

0

BUFSIZ

размер буфера ввода-вывода

FILE

структура, определенная с помощью typedef, содержащая информацию об открытом файле

stdin

указатель на FILE, открытый для стандартного ввода

stdout

указатель на FILE, открытый для стандартного вывода

stderr

указатель на FILE, открытый для стандартного вывода сообщений об ошибках

Пример 1

/*Образец определения типа FILE*/

typedef struct

{

int _cnt; /*количество оставшихся в буфере символов*/

unsigned char *_ptr; /*следующая позиция в буфере*/

unsigned char *_base; /*размещение буфера*/

unsigned char _flag; /*признак ошибки чтения-записи или конца файла*/

unsigned char _file; /*дескриптор файла ситемы UNIX*/

} FILE;

Для уменьшения количества обращений к устройствам (например, к диску) стандартный ввод-вывод выполняется с буферизацией.

Буфер ввода-вывода — это временная область в основной памяти, которая содержит считываемые или записываемые данные.

Данные пересылаются на устройства (с устройств) большими порциями, размер которых определяется поименованной константой BUFSIZ.

Функция fopen() — функция открытия файла.

FILE *fopen(const char *имя_файла, const char *тип)

Первым аргументом функции fopen() является адрес строки, содержащей путевое имя файла.

const char *имя_файла

Второй аргумент — это адрес строки, определяющей тип работы с открываемым файлом.

Тип может принимать следующие значения:

  • "r" — текстовый файл открывается для чтения (read);

  • "w"- текстовый файл создается для записи; старое содержимое, если оно было, выбрасывается (write);

  • "a" — текстовый файл открывается или создается для записи в конец файла (add);

  • "r+" — текстовый файл открывается для исправления, т.е. для чтения и записи;

  • "w+"- текстовый файл создается для исправления, старое содержимое, если оно было, выбрасывается;

  • "a+" — текстовый файл открывается или создается для исправления уже существующей информации и добавления новой в в конец файла.

Объявление прототипа функции fopen() находится в файле заголовков stdio.h,

Для обеспечения уверенности в успешном открытии файла необходимо проверять код, возвращаемый функцией fopen().

fopen("с:\\temp0\\20.04\\1.txt","w");

Пример 1

#include <stdio.h>

int main()

{

FILE *fp;

fp = fopen("logfile", "w");

if (fp == NULL)

printf("Open failed\n");

...

}

результаты успешного открытия файла.

   

 

чтение "r"

запись "w"

добавление "a"

файл существует

-

старое содержимое отбрасывается

-

файл не существует

ошибка

файл создается

файл создается