Advertisement
Guest User

Untitled

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