Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Использование указателей на структуру↑ ⇐ ПредыдущаяСтр 2 из 2 Содержание книги
Поиск на нашем сайте
Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Пусть имеется следующий фрагмент struct bal { 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.
Первые три определены стандартом ANSI С
Каждый поток, ассоциированный с файлом, имеет структуру управления файлом типа FILE.
Данная структура определена в заголовочном файле stdio.h.
Поименованные константы из файла stdio.h. Значения указанных констант зависят от реализации.
Пример 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 *имя_файла
Второй аргумент — это адрес строки, определяющей тип работы с открываемым файлом.
Тип может принимать следующие значения:
Объявление прототипа функции 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");...}Результаты успешного открытия файла.
Функция fclose() Функция fclose() используется для закрытия потока, ранее открытого с помощью fopen(). Она сохраняет в файл данные, находящиеся в дисковом буфере, и выполняет операцию системного уровня по закрытию файла. Вызов fclose() освобождает блок управления файлом, связанный с потоком, и делает его доступным для повторного использования. Функция fclose() имеет прототип: int fclose(FILE *fp); где fp - это указатель на файл, возвращенный fopen(). Если возвращен 0, то это означает, что операция закрытия выполнена успешно, а если EOF, то, значит, была ошибка.
Объявление прототипа функции fclose() находится в файле заголовков stdio.h #include <stdio.h>int main(){ FILE *fp; fp = fopen("logfile", "w"); if (fp == NULL) printf("Open failed\n"); fclose(fp);...}Функции чтения-записи int fprintf(FILE *stream, const char *format,... /*аргументы*/)
Функция преобразует и пишет вывод в поток под управлением формата.
Возвращаемое значение — число записанных символов или, в случае ошибки, отрицательное значение.
Правила построения форматной строки такие же, как для функции printf().
#include <conio.h> #include <stdio.h> int main() { int bal; char name[15]; FILE *file;
if ((file = fopen("с:\\temp0\\20.04\\1.txt","w")) == NULL) printf("Файл невозможно открыть или создать\n"); else{ for(;;){ scanf ("%d%s", &bal, name); if (bal == 0) break; fprintf(file,"%d %s\n", bal, name); } } fclose(file); return 0; }
Функция int fscanf(FILE *stream, const char *format,... /*аргументы*/)
читает данные из потока под управлением формата и преобразованные величины присваивает аргументам, каждый из которых должен быть указателем. Завершает работу, если исчерпался формат. Возвращает EOF по исчерпании файла или перед любым преобразованием, если возникла ошибка. В остальных случаях функция возвращает количество преобразованных и введенных элементов. Правила построения форматной строки такие же, как для функции scanf(). #include <conio.h> #include <stdio.h>
int main() { int bal; char name[15]; FILE *file;
if ((file = fopen("1.txt","r")) == NULL) printf("Файл невозможно открыть или создать\n"); else{ for(;;){ if (feof(file)) break; fscanf(file,"%d %s", &bal, name); printf ("%d %s\n", bal, name); } } fclose(file); getch(); return 0; }
Функции fread() и fwrite() Файловая система ANSI С предоставляет две функции, позволяющие читать и писать блоки данных - fread() и fwrite(). Они имеют следующие прототипы: size_t fread(void *буфер, size_t число_байту size_t объем, FILE *fp); size_t fwrite(const void *буфер, size_t число_байт, size_t объем, FILE *fp); В случае fread() буфер - это указатель на область памяти, которая получает данные из файла. В случае fwrite() буфер - это указатель на информацию, записываемую в файл. Длина каждого элемента в байтах определяется в число_байт. Аргумент объем определяет, сколько элементов (каждый длиной число_байт) будет прочитано или записано. Наконец, fp - это файловый указатель на ранее открытый поток. Функция fread() возвращает число прочитанных элементов. Данное значение может быть меньше, чем объем, если был достигнут конец файла или произошла ошибка. Функция fwrite() возвращает число записанных элементов. Данное значение равно объем, если не возникла ошибка.
#include <conio.h> #include <stdio.h>
int main() { int bal; FILE *file;
if ((file = fopen("3.txt","w")) == NULL) printf("Файл невозможно открыть или создать\n"); else{ for(int i=0; i<5;i++){ scanf("%d", &bal); fwrite (&bal, sizeof(int),1, file); } } fclose(file); getch(); return 0; }
#include <conio.h> #include <stdio.h>
int main() { int bal; FILE *file = fopen("3.txt","r");
if (file == NULL) printf ("Ошибка при открытии файла"); else { while (!feof(file)){ fread(&bal, sizeof(int),1, file); printf ("%d ", bal); } }
fclose(file); getch(); return 0; }
Если файл был открыт для двоичных данных, то fread() и fwrite() могут читать и писать любой тип информации. Например, следующая программа записывает float в файл: /* запись вещественных чисел в файл */ Как иллюстрирует данная программа, буфер может быть (а чаще всего это так и есть) простой переменной. Одно из наиболее полезных применений fread() и fwrite() - это чтение и запись блоков данных типа массивов или структур. Например, следующий фрагмент записывает содержимое массива вещественных чисел balance в файл balance, используя один оператор fwrite(). Далее она читает массив, используя один оператор fread(), и выводит его содержимое. #include <stdio.h> /* открытие на запись */ /* сохранение за раз всего массива balance */ /* обнуление массива */ /* открытие для чтения */ /* чтение за раз всего массива balance */ /* вывод содержимого массива */ Использование fread() и fwrite() для чтения или записи сложных данных более эффективно, чем использование повторяющихся вызовов getc() и putc().
|
||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-07-16; просмотров: 190; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.214.28 (0.011 с.) |