Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_SI.doc
Скачиваний:
30
Добавлен:
23.02.2015
Размер:
2.05 Mб
Скачать

Самостоятельная работа

В файле “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 – переход в конец строки

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]