- •Структуры
- •Доступ к членам структуры
- •Присваивание структур
- •Массивы структур
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Функция fclose()
- •Функции чтения-записи
- •Функции fread() и fwrite()
- •Использование fopen(), getc(), putc() и fclose()
- •Запись символа
- •Чтение символа
- •Использование feof()
- •Две расширенные функции: getw() и putw()
- •Работа со строками: fgets() и fputs()
- •Чтение и запись символов
- •Указатель на файл
- •Открытие файла
Присваивание структур
Информация, содержащаяся в одной структуре, может быть присвоена другой структуре того же типа с помощью одиночного оператора присваивания,
#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
Потоки и файлы
Поток - логическое устройство
Существует два типа потоков: текстовые и двоичные.
Текстовые потоки
Текстовые потоки - это последовательность символов.
В текстовых потоках некоторые символы могут преобразовываться.
Например, символ новой строки может преобразовываться в пару «возврат каретки - перевод строки».
Двоичные потоки
Двоичный поток - это последовательность байт, имеющих однозначное соответствие с байтами во внешнем устройстве (нет преобразования символов)
Файлы
файлы - это логическая концепция
Поток связывается с конкретным файлом с помощью операции открытия.
Если файл открыт, может осуществляться обмен между файлом и программой
Связь потока с файлом уничтожается с помощью операции закрытия.
Для файлового ввода-вывода посредством стандартных библиотечных функций ввода-вывода необходимо выполнить следующие шаги:
Подключить файл заголовков, используя следующую директиву препроцессора #include <stdio.h>.
Объявить указатель на структуру FILE для каждого файла.
Открыть файл, используя функцию fopen().
Использовать функции чтения-записи стандартного ввода-вывода.
Закрыть файл, используя функцию 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" |
файл существует |
- |
старое содержимое отбрасывается |
- |
файл не существует |
ошибка |
файл создается |
файл создается |
