Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2009 лекции ПЯВУ часть1.doc
Скачиваний:
23
Добавлен:
27.03.2015
Размер:
823.3 Кб
Скачать

Закрытие файла

После работы с файлом его необходимо закрыть. Для этого используется функция fclose, в качестве параметра принимающая указатель на открытый файл (см. рис. 8.1, 8.2, 8.3, 8.4 и 8.5).

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

#include <iostream>

#include <stdio.h>

#include <conio.h>

#include <locale.h>

#include <stdlib.h>

#include <time.h>

using namespace std;

int Coding(FILE * text, FILE * res)

{

FILE * code;

code = fopen("code.txt", "rb"); //открытие файла

//в бинарном режиме

if(!code)

{

cout<<"Проверьте наличие файла с закрытым ключом!"

<<endl;

return 0;

}

char let, cd, rs;

long long len=0, count = 0;

fseek(text, 0, SEEK_END);

len = ftell(text); //определение длины файла

fseek(text, 0, SEEK_SET);

int h = 255;

while(++count<=len)

{

let=fgetc(text);

if (h==-1)

h=255;

if((cd = fgetc(code))==EOF)

//у операции присваивания

//приоритет меньше,

//поэтому ее нужно взять в

//круглые скобки

{

fseek(code, 0, SEEK_SET);

cd = fgetc(code);

h=255;

}

cd = cd^h;

rs = let^cd;

fputc(rs, res);

h--;

}

return 1;

}

Рис. 8.6. Функция кодирования

int createcode(void)

{

FILE *code = fopen("code.txt", "rb");

if(code)

{

fclose(code);

return 1;

}

code = fopen("code.txt", "wb");

if(!code)

{

cout<<"Нельзя создать файл с ключом!"<<endl;

return 0;

}

int h = 255;

char r;

srand(time(0));

rand();

for(long long i = 0; i<100000000;i++)

{

if(h== -1)

h=255;

r= rand()%256;

r = r^h;

h--;

fputc(r, code);

}

fclose(code);

return 1;

}

Рис. 8.7. Функция создания секретного ключа

int main()

{

setlocale(LC_ALL, "rus");

srand(time(0));

rand();

while(1)

{

cout<<"*********************************"<<endl;

cout<<"1 - создание секретного ключа"<<endl;

cout<<"2 - кодирование"<<endl;

cout<<"3 - декодирование"<<endl;

cout<<"4 - просмотр результата"<<endl;

cout<<"5 - выход"<<endl;

cout<<"*********************************"<<endl;

Рис. 8.8. Главное меню программы

int c;

cin>>c;

switch(c) {

case 1:

if(createcode())

break;

else {

cout<<"Дальнейшая работа невозможна!" <<endl;

return -1;}

case 2:

FILE *fr, *fw;

char text[260];

char res[260];

while(1) {

cout<<"Имя файла для кодирования"<<endl;

cin.getline(text, 259);

cin.getline(text, 259);

fr = fopen(text, "rb");

if(!fr){

cout<<"Проверьте файл для кодирования" <<endl;

}

else

break;

}

while(1) {

cout<<"Имя файла результата"<<endl;

cin.getline(res, 259);

fw = fopen(res, "wb");

if(!fw)

{

cout<<"Нельзя создать файл с таким \ именем или в указанной директории"<<endl;

}

else break;

}

if(Coding(fr, fw))

{

fclose(fr);

fclose(fw);

break;

}

else {

cout<<"Дальнейшая работа невозможна!" <<endl;

fclose(fr);

fclose(fw);

return -1; }

Рис. 8.9. Продолжение функции main

case 3:

while(1) {

cout<<"Имя файла для декодирования"<<endl;

cin.getline(text, 259);

cin.getline(text, 259);

fr = fopen(text, "rb");

if(!fr){

cout<<"Проверьте файл для декодирования" <<endl;}

else break;}

while(1) {

cout<<"Имя файла результата"<<endl;

cin.getline(res, 259);

fw = fopen(res, "wb");

if(!fw)

{

cout<<"Нельзя создать файл с таким \ именем или в указанной директории"<<endl;

}

else break; }

if(Coding(fr, fw)) {

fclose(fr); fclose(fw);break;}

else {

cout<<"Дальнейшая работа невозможна!" <<endl;

fclose(fr); fclose(fw); return -1;}

case 4:

char text1[1024];

while(1) {

cout<<"Имя файла для просмотра"<<endl;

cin.getline(text1, 259);

cin.getline(text1, 259);

fr = fopen(text1, "r");

if(!fr){

cout<<"Проверьте наличие файла" <<endl;}

else break;

}

while(fgets(text1, 1024,fr))

cout<<text1<<endl;

fclose(fr);

break;

case 5:

cout<<"ОК"<<endl;return 0;

default:

cout<<"Внимательно ознакомьтесь с инструкцией" <<endl;} }

getch();

return 0;}

Рис. 8.10. Окончание функции main