Guest User

Untitled

a guest
Dec 13th, 2019
77
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