SHARE
TWEET

Untitled

a guest Dec 13th, 2019 74 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>    // библиотека ввода-вывода
  2. #include <string.h>   // библиотека строковых функций
  3. #include <io.h>       // библиотека работы с файловой системой
  4. #include <locale.h>   // библиотека языковой локализации
  5.  
  6. /* Размер символьного буфера под имя файла */
  7. #define NAMELEN 64
  8. #pragma warning(disable: 4996)
  9.  
  10. /*  Функция кодирует asci-код символа методом
  11.     перестановки полубайтов с инверсией битов
  12. */
  13. unsigned char Crypt(unsigned char ch)
  14. {
  15.     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));
  16. }
  17.  
  18. /*  Функция запрашивает у пользователя строку длины не больше size
  19.     переводит ее в нижний регистр и сохраняет в массиве buffer[size]
  20. */
  21. void EntryName(char* buffer, int size)
  22. {
  23.     fgets(buffer, size, stdin);
  24.     *strrchr(buffer, '\n') = '\0';
  25.     fflush(stdin);
  26.     strlwr(buffer);
  27. }
  28.  
  29. /*  Функция проверяет корректность имени файла (name), и
  30.     возвращает true – если имя корректно, или false – если нет.
  31. */
  32. bool CheckFileName(char *name)
  33. {
  34.     char *result;
  35.     // Если задан диск, то он указывается в начале пути
  36.     if (result = strchr(name, ':'))
  37.         if ((result - name) != 1) return false;
  38.     // Двойные слеши в пути запрещены
  39.     if (strstr(name, "\\\\")) return false;
  40.     // В конце пути должно быть непустое имя файла
  41.     if (result = strrchr(name, '\\'))
  42.         if (*(result + 1) == '\0') return false;
  43.     // Запрещенные символы в имени или пути
  44.     if (strpbrk(name, "\"<*?|>")) return false;
  45.     return true;
  46. }
  47.  
  48. /*  Главная функция (Интерфейс программы)
  49. */
  50. void main(int argc, char *argv[])
  51. {
  52.     /*  Объявление буферов для имени исходного файла,
  53.         имени файла результата и переменной для символа
  54.     */
  55.     int  ch;
  56.     char sender[NAMELEN], receiver[NAMELEN];
  57.  
  58.     // Для сообщений на русском языке
  59.     setlocale(LC_ALL, "Russian");
  60.     printf("Лаба: Шифрование\n");
  61.  
  62.     /*  Обработка командной строки в формате:
  63.         программа.exe  [Исходный_файл [Файл_результата]]
  64.         где [ ]-обозначает, что параметр может быть не задан
  65.     */
  66.     switch (argc)
  67.     {
  68.         // Заданы все параметры
  69.     case 3:
  70.         strncpy_s(sender, NAMELEN, argv[1], _TRUNCATE);
  71.         strncpy_s(receiver, NAMELEN, argv[2], _TRUNCATE);
  72.         break;
  73.  
  74.         // Задан исходный файл
  75.     case 2:
  76.         strncpy_s(sender, NAMELEN, argv[1], _TRUNCATE);
  77.         goto m_1;
  78.  
  79.         // Ничего не задано (командная строка пустая)
  80.     case 1:
  81.         printf("Введите имя исходного файла:>");
  82.         EntryName(sender, NAMELEN);
  83.     m_1:
  84.         printf("Введите имя файла результата:>");
  85.         EntryName(receiver, NAMELEN);
  86.         break;
  87.  
  88.         // Задано слишком много параметров
  89.     default:
  90.         printf("Формат командной строки:\nprogram.exe [source_filename [result_filename]]\n");
  91.         getchar();
  92.         return;
  93.     };
  94.  
  95.     // Проверить корректность имени исходного файла
  96.     if (!CheckFileName(sender))
  97.     {
  98.         printf("Ошибка: Некорректное имя исходного файла");
  99.         getchar();
  100.         return;
  101.     }
  102.     // Проверить корректность имени файла результата
  103.     if (!CheckFileName(receiver))
  104.     {
  105.         printf("Ошибка: Некорректное имя файла результата");
  106.         getchar();
  107.         return;
  108.     }
  109.     // Проверить существование исходного файла
  110.     if (_access(sender, 0) != 0)
  111.     {
  112.         printf("Ошибка: Исходный файл не найден");
  113.         getchar();
  114.         return;
  115.     }
  116.     // Проверить отсутствие файла результата
  117.     if (_access(receiver, 0) == 0)
  118.     {
  119.         printf("Ошибка: Файл результата уже существует");
  120.         getchar();
  121.         return;
  122.     }
  123.     // Открыть исходный файл на чтение
  124.     FILE* in = fopen(sender, "r");
  125.     if (!in)
  126.     {
  127.         printf("Ошибка: Исходный файл не может быть открыт");
  128.         getchar();
  129.         return;
  130.     }
  131.     // Открыть файл результата на запись
  132.     FILE* out = fopen(receiver, "w");
  133.     if (!out)
  134.     {
  135.         printf("Ошибка: Файл результата не может быть создан");
  136.         getchar();
  137.         return;
  138.     }
  139.  
  140.     printf("\nСтрат обработки файла \"%s\" в файл \"%s\"", sender, receiver);
  141.  
  142.     /* Чтение символа из исходного файла, вызов функции обработки
  143.        кода, запись преобразованного кода в файл результата до тех
  144.        пор, пока не конец исходного файла
  145.     */
  146.     while ((ch = fgetc(in)) != EOF)
  147.     {
  148.         if (ch == '\n' || ch == ' ' || (ch == '\t'))
  149.             fputc(ch, out);
  150.         else
  151.             fputc(Crypt(ch), out);
  152.     }
  153.     // Закрыть файлы
  154.     fclose(in);
  155.     fclose(out);
  156.     // Вывести сообщение о завершении
  157.     printf("\nOK: Обработка завершена");
  158.     getchar();
  159. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top