Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 135; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.236 (0.01 с.) |