- •Оглавление
- •1.2. Свойства языков программирования
- •1.3. Основные парадигмы программирования Процедурное программирование
- •Модульное программирование
- •Абстракция данных
- •Объектно-ориентированное программирование
- •Непечатные символы
- •Тема 2 Типы данных
- •2.1. Понятие переменной и объявление переменных
- •Объявление переменных
- •Встроенные типы данных
- •Размер памяти, выделяемой под встроенные типы данных
- •2.2. Константы и перечисления Константные переменные
- •Перечисления
- •2.3. Операции и выражения
- •Мультипликативные операции
- •Операции сравнения
- •Побитовые логические операции
- •Побитовые операции
- •Комментарии
- •Оператор while(пока)
- •Оператор do/while(выполнять/пока)
- •Оператор for(цикл)
- •Оператор множественного выбора switch
- •Операторы breakиcontinue
- •Тема 4 Массивы
- •4.1.Определение, объявление и инициализация массивов
- •Объявления и инициализация массивов в программе
- •4.2. Сортировка массивов Пузырьковая сортировка
- •Сортировка вставками
- •4.3. Поиск в массивах Линейный поиск
- •Двоичный поиск
- •4.4. Многомерные массивы
- •Тема 5 Указатели Объявления и инициализация переменных указателей
- •5.1. Операции над указателями
- •5.2. Выражения и арифметические действия с указателями
- •5.3. Взаимосвязи между указателями и массивами
- •5.4. Массивы указателей
- •5.5. Динамическое выделение памяти под массивы
- •Тема 6 Функции
- •6.2. Определения функций
- •Генерация случайных чисел
- •6.3. Классы памяти и область действия Классы памяти
- •Область действия
- •6.4. Рекурсия
- •6.5. Ссылки и ссылочные параметры
- •Вызов функций по ссылке с аргументами указателями
- •6.6. Использование спецификатораconstс указателями
- •6.7. Перегрузка функций
- •Аргументы по умолчанию
- •6.8. Передача массивов в функции
- •6.9. Указатель на функцию
- •6.10. Командная строка аргументов
- •6.11 Неопределенное количество аргументов
- •Тема 7 Введение в обработку строк
- •7.1. Работа со строками в с
- •Понятие символов и строк в с
- •Функции для работы со строками
- •Определение длины строки
- •Сложение двух строк (конкатенация)
- •Добавление к исходной строке указанного количества символов.
- •Копирование строки в другую строку
- •Сравнение строк
- •Получение строки от пользователя
- •Тема 8 Работа с файлами
- •Открытие файла
- •Чтение из файла символа или строки символов
- •Запись символа или строки символов в файл
- •Смещение внутри файла
- •Значения параметра fromwhereфункцииfseek
- •Закрытие файла
- •Тема 9 Компоновка программ и препроцессор
- •9.1. Компоновка программ
- •Проблема использования общих функций и имен
- •Использование включаемых файлов
- •9.2. Препроцессор
- •Определение макросов
- •Условная компиляция
- •Дополнительные директивы препроцессора
- •Тема 10 Структуры
- •10.1. Определение структур и доступ к элементам
- •Доступ к элементам структур
- •Использование структур
- •10.2. Битовые поля
- •10.3. Объединения
- •10.4. Построение связных списков на основе структур с самоадресацией
- •Создание простого связного списка
- •Очереди
- •Деревья
- •Список рекомендуемой литературы
Закрытие файла
После работы с файлом его необходимо закрыть. Для этого используется функция 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