Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Дополнительные функции для работы с файлами




Else

Else

Else

Else

Do

{

// Открываем файл с сгенерированным именем для чтения очередного фрагмента.

// Если открылся

if ((f = fopen(get_cur_name(new_name, base_name, ext, num_part, format_str, cur_number++), "rbS"))!= NULL)

{

if (buf == NULL)

{

part_size = filelength(fileno(f));

buf = new char [part_size];

}

/* {

Читаем данные (необходимо 2-ой аргумент функции _read привести к типу данных нетипизированный указатель (void *)) и определяем, сколько прочитано. Если не ошибка

*/

if ((cnt_read = fread((void *)(buf), 1, part_size, f)) > 0)

{

// Записываем столько, сколько прочитали

fwrite((void *)(buf), 1, cnt_read, f_out);

// Закрываем очередной входной файл

fclose(f);

}

}

break;

// Пока количество прочитанных байт совпадает с размером фрагмента

}while (cnt_read == part_size);

// Закрываем исходный файл

fclose(f_out);

delete []buf;

delete []base_name;

delete []ext;

}

delete []new_name;

delete []format_str;

delete []num_part;

return f == NULL? -1: 0;

}

//----------------------------------------------------------------

main(int argc, char *argv[])

{

char *name, *name_out;

UINT quantity;

// Если есть хотя бы 1 аргумент командной строки

if (argc >= 1)

{

// 0-ой элемент массива argv хранит путь к исполнимому файлу программы

name = new char [strlen(argv[1]) + 1];

// Считываем его как имя файла

strcpy(name, argv[1]);

}

// Иначе вводим с клавиатуры

{

name = new char [MAX_NAME + 1];

printf("Enter file name of some parts of source file: ");

scanf("%s", name);

}

// Если 2-ой аргумент командной строки

if (argc >= 2)

{

// Переводим его в числовой вид и интерпретируем как количество фрагментов

// Для перевода в целочисленный вид используется функция atoi, прототип

// которой описан в файле stdlib.h

quantity = atoi(argv[2]);

}

// Если 2-ого аргумента командной строки нет или

// перевод в число был неудачен, то считываем с клавиатуры

if (argc < 2 || quantity == 0)

{

printf("Enter file name: ");

scanf("%u", &quantity);

}

if (argc >= 3)

{

// 0-ой элемент массива argv хранит путь к исполнимому файлу программы

name_out = new char [strlen(argv[3]) + 1];

// Считываем его как имя файла

strcpy(name_out, argv[3]);

}

// Иначе вводим с клавиатуры

{

name_out = new char [MAX_NAME + 1];

printf("Enter output file name: ");

scanf("%s", name_out);

}

if (read_parts(name, quantity, name_out) == -1)

puts("An error was found! Check filename and try once more!");

puts("Operation was successfully completed");

delete []name;

delete []name_out;

return 0;

}

Для того, чтобы задать аргументы командной строки при запуске из среды Microsoft Visual Studio 6.0, необходимо выбрать пункт меню Project\Settings (или нажать сочетание клавиш Alt + F7), в открывшемся диалоговом окне выбрать вкладку Debug и на этой вкладке в окне редактирования Program arguments ввести через пробел необходимое количество аргументов командной строки.

 

 

Рассмотрим некоторые функции, предназначенные для работы с неоткрытыми файлами (для их использования необходимо подключить stdio.h или io.h):

1. int remove (const char *path) – выполняет удаление файла, указанного своим именем (1-ый аргумент). Если файл удален успешно, то функция возвращает 0, иначе -1.

2. int rename (const char *oldname, const char *newname) – переименовывает файл или каталог, заданный своим именем (1-ый аргумент), изменяя его имя на 2-ой аргумент. Если переименование выполнено успешно, то функция возвращает 0, иначе - не 0.

Задание

 

1. Для получения 100% от числа баллов, отводимых на лабораторную работу, необходимо написать программу, которая осуществляет шифрование / дешифрование файла, используя при этом блочную работу с файлом и пароль длиной от 1 до 30 символов.

2. Для получения 75% от числа баллов, отводимых на лабораторную работу, необходимо написать программу, которая осуществляет шифрование / дешифрование файла, используя при этом пароль длиной от 1 до 30 символов (Можно использовать посимвольный обмен данными с файлами).

3. Для получения 65% от числа баллов, отводимых на лабораторную работу, необходимо написать программу, осуществляет шифрование / дешифрование файла, используя при этом пароль длиной 1 символ (Можно использовать посимвольный обмен данными с файлами).

 

Входные данные:

· имя исходного файла вводится через аргументы командной строки или с клавиатуры. Необходимо проверить удачность открытия файла, в случае неудачи вывести сообщение об ошибки и прекратить работу программы;

· имя выходного файла вводится через аргументы командной строки или с клавиатуры. Необходимо проверить удачность открытия файла, в случае неудачи вывести сообщение об ошибки и прекратить работу программы;

· пароль вводится через аргументы командной строки или с клавиатуры.

Выходные данные:

· выходной файл (зашифрованный или расшифрованный).

 

Алгоритм шифрования / дешифрования следующий:

Над каждым символом исходного файла проводится побитовая операция ^ (побитовое исключающее «ИЛИ») с текущим символом пароля, т.е.

cout = cin ^ p;

где cout – текущий символ выходного файла; сin – текущий символ исходного файла; p – текущий символ пароля.

Таким образом, вышеописанный алгоритм является симметричным, т.е. один и тот же пароль используется для шифрования и дешифрования. Поэтому режим шифрования или дешифрования явно не указывается.

Текущий символ пароля (если выполняется вариант задания с многосимвольным паролем) выбирается следующим образом: от 1-ого до последнего, по достижению последнего символа следующим снова выбирается первый символ и т.д.

 

Программа должна быть написана с применением процедурно-ориентированного подхода (использовать пользовательские функции).

 





Поделиться с друзьями:


Дата добавления: 2017-01-14; Просмотров: 774; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.021 сек.