Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Функции ввода/вывода в двоичные файлы
Функция ввода/вывода fread и fwrite
Двоичный файл это последовательность данных не текстового формата. Поэтому редактировать файл в текстовом редакторе невозможно. С другой стороны такой файл может иметь меньший объем, а для редактирования могут быть предназначены специальные редакторы. Чтение и запись потока байтов выполняют функции fread и fwrite. fread(void *buffer, size, count, FILE *f); Функция считывает count элементов длиной size байтов в буфер, заданный указателем buffer, из потока f. Функция возвращает количество прочитанных элементов, которое может быть меньше count, если при чтении произошла ошибка или встретился конец файла. fwrite(const void *p, size, n, FILE *f); Функция записывает n элементов длиной size байт из буфера, заданного указателем р, в поток f. Возвращает число записанных элементов. Пример, демонстрирующий работу с этими функциями:
struct Client { int Num; char SurName[27]; char Name[21]; char SecName[21]; }; FILE *stream; Client AClient, RClient; //Открываем файл для вывода if ((stream = fopen("d:\\SAMPLE.DAT", "wb")) == NULL) { printf(RUS("Файл не открыт для записи\n")); getch(); return 1; } AClient.Num = 1; strcpy(AClient.SurName,"Petrov"); strcpy(AClient.Name, "Petr"); strcpy(AClient.SecName, "Petrovich"); //Запись структуры в файл fwrite(&AClient, sizeof(AClient), 1, stream); //Закрываем файл fclose (stream); //Открываем файл для чтения if ((stream = fopen ("d:\\SAMPLE.DAT ", "rb")) == NULL) { printf (RUS("Файл не открыт для чтения\n")); getch(); return 2; } fread(&RClient, sizeof (RClient), 1, stream); //Закрываем файл fclose (stream); printf ("The structure contains: \n "); printf ("Num = %d SurName = %s Name = %s SecName = %s", RClient. Num, RClient. SurName, RClient. Name, RClient. SecName);
В этом примере вначале файл открывается для записи в него значений полей из структуры AClient, затем этот файл открывается для чтения содержащейся в нем информации в структуру RClient. После чего поля этой структуры выводятся на экран. При выполнении программа выводит на экран: The structure contains: Num = 1 SurName = Petrov Name = Petr SecName = Petrovich
Функции позиционирования
Операции ввода/вывода выполняются, начиная с текущей позиции потока, определяемой положением (значением) указателя потока. Указатель устанавливается при открытии на начало или конец файла (в соответствии с режимом открытия ²a²,²a+²) и изменяется автоматически после каждой операции ввода/вывода. Текущее положение указателя можно получить с помощью функций ftell и fgetpos и задать явным образом с помощью функций fseek, fsetpos и rewind. Эти функции нельзя использовать для стандартных потоков.
long int ftell(FILE *f); Функция возвращает текущую позицию в файле, связанном с потоком f, как длинное целое. В случае ошибки она возвращает –1. int fgetpos(FILE *f, fpos_t *pos); Функция возвращает текущую позицию в файле, связанном с потоком f, и копирует значение по адресу pos. Это значение позднее может использоваться функцией fsetpos. Возвращаемое значение имеет тип fpos_t. int fseek(FILE *f, long off, int org); Функция перемещает текущую позицию в файле, связанном с потоком f, на позицию off, отсчитываемую от значения org, которое должно быть равно одной из трех констант, определенных в <stdio.h>: SEEK_CUR (=1) – от текущей позиции указателя; SEEK_END (=2) – от конца файла; SEEK_SET (=0) – от начала файла. Функция возвращает 0, если указатель текущей позиции в файле успешно изменен, и отличное от 0 значение в противном случае. int fsetpos(FILE *f, const fpos_t *pos); Функция перемещает текущую позицию в файле, связанном с потоком f, на позицию *pos, предварительно полученную с помощью функции fgetpos. void rewind(FILE *f); Функция очищает флаги ошибок в потоке f и устанавливает текущую позицию на начало файла. Функции позиционирования позволяют провести вывод непосредственно после ввода, не закрывая файл. Для этого их записывают между функциями ввода и вывода. Однако рекомендуется всегда явным образом закрывать потоки, открытые для записи, чтобы избежать потери данных. Рассмотрим пример, демонстрирующий работу этих функций:
struct Client { int Num; char SurName[27]; char Name[21]; char SecName[21]; }; FILE *stream; Client AClient, RClient; //Открываем файл для вывода if ((stream = fopen("d:\\SAMPLE.DAT", "wb")) == NULL) { printf(RUS("Файл не открыт для записи\n")); getch(); return 1; } AClient.Num = 1; strcpy(AClient.SurName,"Petrov"); strcpy(AClient.Name, "Petr"); strcpy(AClient.SecName, "Petrovich"); //Запись структуры в файл fwrite(&AClient, sizeof(AClient), 1, stream); long int pos = ftell(stream); //Выводим позицию файла и длину структуры printf("The file pos = %d structure length = %d\n", pos, sizeof(AClient)); //Репозиционируем файл rewind(stream); //Открываем файл для чтения if ((stream = fopen ("d:\\SAMPLE.DAT ", "rb")) == NULL)
{ printf (RUS("Файл не открыт для чтения\n")); getch(); return 2; } fread(&RClient, sizeof (RClient), 1, stream); //Закрываем файл fclose (stream); printf ("The structure contains: \n "); printf ("Num = %d SurName = %s Name = %s SecName = %s", RClient. Num, RClient. SurName, RClient. Name, RClient. SecName);
Этот пример представляет собой модификацию предыдущего примера. Здесь файл открывается лишь однажды, и после записи в него структуры на экран выводится значение указателя позиции и длины структуры. При выполнении программа выводит на экран: The file pos = 76 structure length = 76 The structure contains: Num = 1 SurName = Petrov Name = Petr SecName = Petrovich
Пример работы с потоками
Допустим, что в файле хранятся сведения о мониторах. В каждой строке указан тип, оптовая и розничная цены и примечание. Для простоты данные в каждой строке записаны единообразно: первые 20 символов занимает тип монитора, далее по 5 символов целые числа, представляющие оптовую и розничную цены, затем примечание длиной не более 40 символов. Приведенная ниже программа построчно считывает данные из текстового файла в буферную переменную s, затем формирует из них структуру mon и записывает ее в двоичном режиме в выходной файл. Далее производится считывание из этого файла произвольной записи.
FILE *fi, *fo; if((fi = fopen("d:\\file.txt", "r")) == 0){ cout << "Ошибка открытия входного файла"; return 1;} if((fo = fopen("d:\\binfile.out", "w+b")) == 0){ cout << "Ошибка открытия выходного файла"; return 1;} const int dl = 80; char s[dl]; struct{ char type[20]; int opt, rozn; char comm[40]; }mon; int kol = 0; // Количество записей в файле while (fgets(s, dl, fi)) // Преобразование строки в структуру: { strncpy(mon.type, s, 19); mon.type[19]='\0'; mon.opt = atoi(&s[20]); mon.rozn = atoi(&s[25]); strncpy(mon.comm, &s[30], 40); fwrite(&mon, sizeof mon, 1, fo); kol++; } fclose(fi); int i; cout << RUS("\nВведите номер записи "); cin >> i; // Номер записи if (i >= kol) {cout << "Запись не существует"; return 1;} // Установка указателя текущей позиции файла на запись i: fseek(fo, (sizeof mon)*i, SEEK_SET); fread(&mon, sizeof mon, 1, fo); cout << "mon. type " << mon.type << " opt " << mon.opt << " rozn " << mon.rozn << endl; fclose(fo);
Задание к лабораторной работе №12
Задание 1 Написать программу, которая считывает из текстового файла три предложения и выводит их, переставив слова в обратном порядке.
Задание 2 Написать программу, которая считывает текст из файла и выводит на экран только предложения, содержащие введенное с клавиатуры слово.
Задание 3 Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа.
Задание 4 Написать программу, которая считывает английский текст из файла и выводит на экран слова, начинающиеся с гласных букв. Задание 5 Написать программу, которая считывает текст из файла и выводит его на экран, меняя местами каждые два соседних слова.
Задание 6 Написать программу, которая считывает текст из файла и выводит на экран слова, после которых стоит запятая.
Задание 7 Написать программу, которая считывает текст из файла и определяет, сколько в нем слов, содержащих менее четырех букв.
Задание 8 Написать программу, которая считывает текст из файла и выводит на экран только цитаты, то есть предложения, заключенные в кавычки, которые могут занимать несколько строк.
Задание 9 Написать программу, которая считывает текст из файла и выводит на экран только предложения, состоящие из заданного количества слов.
Задание 10 Написать программу, которая считывает английский текст из файла и выводит на экран слова текста, начинающиеся и оканчивающиеся на гласные буквы.
Задание 11 Написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел.
Задание 12 Написать программу, которая считывает текст из файла и выводит на экран только предложения, начинающиеся с тире, перед которым могут находиться только пробельные символы.
Задание 13 Написать программу, которая считывает английский текст из файла и выводит его на экран, заменив каждую первую букву слов, начинающихся с гласной буквы, на прописную.
Задание 14 Написать программу, которая считывает текст из файла и выводит его на экран, заменив цифры от 0 до 9 на слова «ноль», «один»,..., «девять», начиная каждое предложение с новой строки.
Задание 15 Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте.
Задание 16 (повышенная сложность) Написать программу, которая считывает Текст из файла и выводит на экран сначала вопросительные, а затем восклицательные предложения.
Задание 17 Написать программу, которая считывает текст из файла и выводит его на экран, после каждого предложения добавляя, сколько раз встретилось в нем введенное с клавиатуры слово.
Задание 18 Написать программу, которая считывает текст из файла и выводит на экран сначала предложения, начинающиеся с однобуквенных слов, а затем все остальные.
Задание 19 Написать программу, которая считывает текст из файла и выводит на экран предложения, содержащие максимальное количество знаков пунктуации.
Содержание отчета
Отчет выполняется в редакторе Word 2000 и должен содержать:
1. Листинг программ на языке Си, решающих задачи в соответствии с вариантом (номером компьютера) задания; 2. Блок-схему алгоритма программ; 3. Пояснения по методу решения задач; 4. Результаты тестирования программ.
При оформлении отчета следует пользоваться копированием листинга и результата тестирования в Word. Последний копируется с помощью комбинации клавиш ALT Prt Sc при условии активности консольного окна, что означает копирование графики окна в буфер обмена Windows. Затем окно вставляется в документ Word как любой другой объект.
ЛАБОРАТОРНАЯ РАБОТА №13
|
|||||||
Последнее изменение этой страницы: 2021-11-27; просмотров: 56; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.166.7 (0.045 с.) |