Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> // библиотека ввода-вывода
- #include <string.h> // библиотека строковых функций
- #include <io.h> // библиотека работы с файловой системой
- #include <locale.h> // библиотека языковой локализации
- /* Размер символьного буфера под имя файла */
- #define NAMELEN 64
- #pragma warning(disable: 4996)
- /* Функция кодирует asci-код символа методом
- перестановки полубайтов с инверсией битов
- */
- unsigned char Crypt(unsigned char ch)
- {
- return ~(((ch & 0x80) >> 3) | ((ch & 0x10) << 3) | ((ch & 0x40) >> 5) | ((ch & 0x02) << 5) | ((ch & 0x20) >> 3) | ((ch & 0x04) << 3) | ((ch & 0x08) >> 3) | ((ch & 0x01) << 3));
- }
- /* Функция запрашивает у пользователя строку длины не больше size
- переводит ее в нижний регистр и сохраняет в массиве buffer[size]
- */
- void EntryName(char* buffer, int size)
- {
- fgets(buffer, size, stdin);
- *strrchr(buffer, '\n') = '\0';
- fflush(stdin);
- strlwr(buffer);
- }
- /* Функция проверяет корректность имени файла (name), и
- возвращает true – если имя корректно, или false – если нет.
- */
- bool CheckFileName(char *name)
- {
- char *result;
- // Если задан диск, то он указывается в начале пути
- if (result = strchr(name, ':'))
- if ((result - name) != 1) return false;
- // Двойные слеши в пути запрещены
- if (strstr(name, "\\\\")) return false;
- // В конце пути должно быть непустое имя файла
- if (result = strrchr(name, '\\'))
- if (*(result + 1) == '\0') return false;
- // Запрещенные символы в имени или пути
- if (strpbrk(name, "\"<*?|>")) return false;
- return true;
- }
- /* Главная функция (Интерфейс программы)
- */
- void main(int argc, char *argv[])
- {
- /* Объявление буферов для имени исходного файла,
- имени файла результата и переменной для символа
- */
- int ch;
- char sender[NAMELEN], receiver[NAMELEN];
- // Для сообщений на русском языке
- setlocale(LC_ALL, "Russian");
- printf("Лаба: Шифрование\n");
- /* Обработка командной строки в формате:
- программа.exe [Исходный_файл [Файл_результата]]
- где [ ]-обозначает, что параметр может быть не задан
- */
- switch (argc)
- {
- // Заданы все параметры
- case 3:
- strncpy_s(sender, NAMELEN, argv[1], _TRUNCATE);
- strncpy_s(receiver, NAMELEN, argv[2], _TRUNCATE);
- break;
- // Задан исходный файл
- case 2:
- strncpy_s(sender, NAMELEN, argv[1], _TRUNCATE);
- goto m_1;
- // Ничего не задано (командная строка пустая)
- case 1:
- printf("Введите имя исходного файла:>");
- EntryName(sender, NAMELEN);
- m_1:
- printf("Введите имя файла результата:>");
- EntryName(receiver, NAMELEN);
- break;
- // Задано слишком много параметров
- default:
- printf("Формат командной строки:\nprogram.exe [source_filename [result_filename]]\n");
- getchar();
- return;
- };
- // Проверить корректность имени исходного файла
- if (!CheckFileName(sender))
- {
- printf("Ошибка: Некорректное имя исходного файла");
- getchar();
- return;
- }
- // Проверить корректность имени файла результата
- if (!CheckFileName(receiver))
- {
- printf("Ошибка: Некорректное имя файла результата");
- getchar();
- return;
- }
- // Проверить существование исходного файла
- if (_access(sender, 0) != 0)
- {
- printf("Ошибка: Исходный файл не найден");
- getchar();
- return;
- }
- // Проверить отсутствие файла результата
- if (_access(receiver, 0) == 0)
- {
- printf("Ошибка: Файл результата уже существует");
- getchar();
- return;
- }
- // Открыть исходный файл на чтение
- FILE* in = fopen(sender, "r");
- if (!in)
- {
- printf("Ошибка: Исходный файл не может быть открыт");
- getchar();
- return;
- }
- // Открыть файл результата на запись
- FILE* out = fopen(receiver, "w");
- if (!out)
- {
- printf("Ошибка: Файл результата не может быть создан");
- getchar();
- return;
- }
- printf("\nСтрат обработки файла \"%s\" в файл \"%s\"", sender, receiver);
- /* Чтение символа из исходного файла, вызов функции обработки
- кода, запись преобразованного кода в файл результата до тех
- пор, пока не конец исходного файла
- */
- while ((ch = fgetc(in)) != EOF)
- {
- if (ch == '\n' || ch == ' ' || (ch == '\t'))
- fputc(ch, out);
- else
- fputc(Crypt(ch), out);
- }
- // Закрыть файлы
- fclose(in);
- fclose(out);
- // Вывести сообщение о завершении
- printf("\nOK: Обработка завершена");
- getchar();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement