- •Лабораторные работы. Сборник задач.
- •Оглавление
- •Часть 1. Лаборатоные работы
- •Работа со структурами и объединениями …………………………………….91
- •3 Задача
- •4 Задача
- •5 Задача
- •6 Задача
- •Дополнительное условие:использование цикла с предусловием.
- •1 Задача
- •2 Задача
- •Дополнительное условие: программа написана без использования функции.
- •Дополнительное условие: программа написана с использованием функций.
- •3 Задача
- •Дополнительное условие: программа написана без использования функции.
- •Дополнительное условие: программа написана с использованием функции.
- •4 Задача
- •Дополнительное условие: программа написана без использования функции
- •Дополнительное условие: программа написана с использованием функции.
- •Самостоятельная работа
- •Лабораторная работа №3
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •Лабораторная работа №6
- •1 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •4 Задача
- •Синтаксический анализатор
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •3 Задача
- •Работа с каталогами
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •2 Задача
- •1 Задача Реализовать очередь, состоящую из целых чисел
- •Комментарий:
- •2 Задача
- •1 Задача
- •Идеально-сбалансированные деревья
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •1 Задача
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности.
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •Работа с несколькими массивами
- •Преобразование массива
- •Изменение элементов массива
- •2 Уровень сложности Формирование массива и вывод его элементов
- •Анализ элементов массива
- •Преобразование массива
- •Изменение элементов массива
- •Удаление и вставка элементов
- •Серии целых чисел
- •3 Уровень сложности Множества точек на плоскости
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •Not простое_логическое
- •(Простое_логическое знак_операции простое_логическое)
- •Построить синтаксический анализатор для понятия предложение.
- •1 Уровень сложности
- •2 Уровень сложности
- •1 Уровень сложности
- •Примеры:
- •Двусвязные списки
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
Самостоятельная работа
В файле “a.txt” содержится шаблон поздравления с днем рождения информация. Переписать содержимое из этого файла в файл с именем “b.txt”, добавив имя адресата и подпись (имя адресата и подпись вводит пользователь).
Лабораторная работа №12
Работа с двоичными файлами. Прямой доступ к элементам файла.
Цель: закрепление на практике знаний функций работы с бинарными файлами.
Методические рекомендации: лабораторная работа рассчитана на 4 часа и состоит из анализа трех разобранных заданий и решения самостоятельной работы.
Обязательное зачетное задание.
Необходимый уровень знаний:
работа с функциями.
1 Задача
Написать программу, которая бы позволяла создавать бинарный файл, записывать в него информацию, считывать значения из этого файла и выводить их на консоль и осуществлять поиск в файле по введенной пользователем подстроке. Выбор последовательности действий должен осуществляться с помощью меню.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// функция для нахождения длины файла
int getFileLength(FILE *file);
// функция для вывода меню на экран
voidprintMenu();
// функция для создания нового файла
void createNewFile(char* path);
// функция для чтения файла и вывода его содержимого на консоль
void viewFile(char* path);
// функция поиска подстроки strв файле, путь к которому находится в строке path
void search(char* path, char* str);
// функция для нахождения длины файла
int getFileLength(FILE *file)
{
fseek(file, 0, SEEK_END);
int length = ftell(file);
rewind(file);
return length;
}
// функция для вывода меню на экран
void printMenu()
{
printf("\n");
printf("\n=================================");
printf("\n============ MENU ===============");
printf("\n=================================\n");
printf("1. Create new file from console\n");
printf("2. View file content\n");
printf("3. Find text sequence in file\n");
printf("4. Exit\n");
printf("\n");
printf("Your choice: ");
}
// функция для создания нового файла
void createNewFile(char* path)
{
// открытие файла для записи в бинарном формате
FILE *file = fopen(path, "wb");
if (file == NULL)
{
// если ошибка открытия, выводится сообщение и осуществляется выход из функции
printf("Unable to open file %s ...\n", path);
return;
}
printf("Type text to file here: \n");
char ch;
// чтение символов с консоли пока не встретится '.'
while ( (ch = getchar()) != '.')
{
// запись символа в файл
fputc(ch, file);
}
// закрытие файла
if (fclose(file) != 0)
printf("Unable to close file successfully...");
// вывод сообщения об успешном сохранении
printf("File %s successfully saved.\n", file);
}
// функция чтения файла и вывод его содержимого на консоль
void viewFile(char* path)
{
// открытие бинарного файла для чтения
FILE *file = fopen(path, "rb");
if (file == NULL)
{
// если ошибка открытия, выводим сообщение и выходим из функции
printf("Unable to open file %s ...", path);
return;
}
// получения длинны файла
int length = getFileLength(file);
// чтение из файла символов и запись их в строку
char* str = (char*) malloc (length * sizeof(char) + 1);
fread(str, sizeof(char), length, file);
str[length] = '\0';
// вывод строки на консоль
printf("%s", str);
// закрытие файла
if (fclose(file) != 0)
printf("Unable to close file successfully...");
}
// функция поиска подстроки в файле
void search(char* path, char* str)
{
// открытие файла на чтение
FILE *file = fopen(path, "rb");
if (file == NULL)
{
// если ошибка открытия, выводим сообщение и выходим из функции
printf("Unable to open file %s ...", path);
return;
}
// получения длины файла
int length = getFileLength(file);
// создание строки
char *source = (char*) malloc (length * sizeof(char) + 1);
// и считывание в нее информации из файла
fread(source, sizeof(char), length, file);
str[length] = '\0';
// закрытие файла
if (fclose(file) != 0)
printf("Unable to close file successfully...");
// идем по строке из файла
int j = 0;
int len = strlen(source);
int lenstr = strlen(str);
bool success = true;
for (int i = 0; i < len; i++)
{
// если символ в строке совпадает с первым символом из строки поиска
if (source[i] == str[j])
{
int start = i++;
// идем теперь по обоим строкам и проверяем совпадения
for (j = 1; j < lenstr; j++, i++)
{
// если не совпадает, начинаем опять поиск по начальной строке
if (source[i] != str[j])
{
success = false;
break;
}
}
// если полное совпадение выводим позицию вхождения
if (success)
{
printf("Founded at %d position\n", start);
j = 0;
}
}
}
}
int main ()
{
FILE *file;
bool exit = false;
int choice;
char* tmp1 = (char*) malloc (255 * sizeof(char));
char* tmp2 = (char*) malloc (255 * sizeof(char));
while (!exit)
{
printMenu();
scanf("%d", &choice);
switch(choice)
{
case 1:
printf("\n\n---------------------------------\n");
printf("Input filepath to create new file: ");
scanf("%s", tmp1);
// dummy оператор для пропуска нажатия Enter
getchar();
createNewFile(tmp1);
break;
case 2:
printf("\n\n-----------------------\n");
printf("Input filepath for view: ");
scanf("%s", tmp1);
viewFile(tmp1);
break;
case 3:
printf("\n\n-------------------------\n");
printf("Input filepath for search: ");
scanf("%s", tmp1);
printf("Input text to search: ");
scanf("%s", tmp2);
search(tmp1, tmp2);
break;
case 4: exit = true;
break;
}
}
free(tmp1);
free(tmp2);
return 0;
}
Комментарии:
SEEK_SET– переход в начало строки
SEEK_CUR– остаться в текущей позиции
SEEK_END – переход в конец строки