withWinApi.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include "Header.h"
  2. void createFileWinApi(char* path)
  3. {
  4. HANDLE FileTask;//указатель на файл
  5. FileTask = CreateFileA(//создание файла
  6. path, //название
  7. GENERIC_READ | GENERIC_WRITE | GENERIC_ALL,//доступ на чтение и запись
  8. FILE_SHARE_WRITE | FILE_SHARE_READ,//разделяемый доступ для письма и чтения
  9. NULL,//безопасность
  10. CREATE_ALWAYS,//описание - всегда создает новый файл
  11. FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//атрибуты файла
  12. 0);//файл шаблона
  13. if (GetLastError() == 2)
  14. {
  15. printf("Не удалось создать файл\n");//вывод ошибки в консоль
  16. exit(1);//код ошибки
  17. }
  18. CloseHandle(FileTask);
  19. }
  20. void deleteFileWinApi(char* path)
  21. {
  22. if (GetFileAttributesA(path) != -1)//если файл существует, т.е. возвращаемое значение GetFileAttributesA != INVALID_FILE_ATTRIBUTES
  23. {
  24. DeleteFileA(path);//удаляем файл
  25. }
  26. }
  27. void writeWinApi(char* path, char* str)
  28. {
  29. deleteFileWinApi(path); //удляем старый файл если такой есть
  30. createFileWinApi(path); //создаем новый файл
  31. HANDLE FileTask;//указатель на файл
  32. FileTask = CreateFileA(//создание файла
  33. path, //название
  34. GENERIC_READ | GENERIC_WRITE | GENERIC_ALL,//доступ на чтение и запись
  35. FILE_SHARE_WRITE | FILE_SHARE_READ,//разделяемый доступ для письма и чтения
  36. NULL,//безопасность
  37. CREATE_NEW,//описание - всегда создает новый файл
  38. FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//атрибуты файла
  39. 0);//файл шаблона
  40. if (GetLastError() == 2)
  41. {
  42. printf("Не удалось открыть файл\n");//вывод ошибки в консоль
  43. exit(1);//код ошибки
  44. }
  45. char* info_buf = calloc(1000, sizeof(char));
  46. char* buffer = calloc(strlen(str)+1,sizeof(char)); //буфер для записи содержимого файла
  47. FileTask = OpenFile(//открытие файла
  48. path,//путь откуда открываем
  49. info_buf,//структура открываемого файла
  50. OF_WRITE | OF_READWRITE);//создает файл и открывает для записи
  51. if (GetLastError() == -1)
  52. {
  53. printf("Ошибка открытия файла");
  54. exit(1);
  55. }
  56. WriteFile(//запись информации в новый файл
  57. FileTask,//куда
  58. str,//что
  59. strlen(str),//объем
  60. NULL,//фактический размер
  61. NULL);//флаг доступа
  62. if (GetLastError() == 6)//ERROR_INVALID_HANDLE - ошибка записи
  63. {
  64. printf("Oшибка записи в файл\n");
  65. exit(6);
  66. }
  67. CloseHandle(FileTask);//отпускаем указатель
  68. }
  69. char* readWinApi(char* path)
  70. {
  71. HANDLE FileTask;//указатель на файл
  72. FileTask = CreateFile(//создание файла
  73. path, //название
  74. GENERIC_READ | GENERIC_WRITE | GENERIC_ALL,//доступ на чтение и запись
  75. FILE_SHARE_WRITE | FILE_SHARE_READ,//разделяемый доступ для письма и чтения
  76. NULL,//безопасность
  77. OPEN_EXISTING | OPEN_ALWAYS,//описание - всегда создает новый файл
  78. FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//атрибуты файла
  79. 0);//файл шаблона
  80. if (GetLastError() == 2)
  81. {
  82. printf("Не удалось открыть файл\n");//вывод ошибки в консоль
  83. exit(1);//код ошибки
  84. }
  85. char* info_buf = calloc(1000, sizeof(char));
  86. char* buffer = calloc(1000, sizeof(char)); //буфер для записи содержимого файла
  87. FileTask = OpenFile(//открытие файла
  88. path,//путь откуда открываем
  89. info_buf,//структура открываемого файла
  90. OF_READ);//создает файл и открывает для чтения и записи
  91. if (GetLastError() == -1)
  92. {
  93. printf("Ошибка открытия файла");
  94. exit(1);
  95. }
  96. ReadFile(//чтение файла
  97. FileTask,//указатель на файл
  98. buffer,//куда записываются файлы
  99. 1000,//объем данных не больше размера буфера
  100. NULL,//фактический размер записываемых данных
  101. NULL);//флаг режима к доступу
  102. if (GetLastError() == 1784 || GetLastError() == 6)
  103. {
  104. printf("ошибка чтения файла");
  105. exit(5);
  106. }
  107. CloseHandle(FileTask);//отпускаем указатель
  108. return buffer;
  109. }
  110. void withWinApi()
  111. {
  112. char* thisPath = PATH2;
  113. char* thisAnswer = ANSWERTASK2;
  114. deleteFileWinApi(thisAnswer);//удаляем файл с ответом, чтобы в случаев возникновения ошибки файла не было
  115. printf("\nВведите коэфициенты уравнения:");
  116. char* str = calloc(1000, sizeof(char));
  117. gets(str);
  118. writeWinApi(thisPath, str);
  119. char* buffer = readWinApi(thisPath);
  120. //объявление переменных
  121. float a;
  122. float b;
  123. float c;
  124. int CODE_PARAM = sscanf(buffer, "%f%f%f", &a, &b, &c);//заполнение переменных
  125. countArg(CODE_PARAM);
  126. float Discriminant = b * b - 4 * c * a;//нахождение дискриминанта
  127. char* answer = calloc(1000, sizeof(char));
  128. if (Discriminant < 0)//если дискриминант отрицательный
  129. {
  130. printf("Дискриминант меньше 0. Решения нет\n");//вывод ошибки в консоль
  131. sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s %5.3f", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0\nРешения не имеет, поскольку имеет отрицательный дискриминант = ", Discriminant);//запись строки
  132. writeWinApi(thisAnswer, answer);
  133. exit(3);//код ошибки
  134. }
  135. //проверка первого аргумента на плешивость
  136. if (a == 0)
  137. {
  138. printf("Попытка деления на 0\n");
  139. sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0\n Попытка деления на 0");//запись строки
  140. writeWinApi(thisAnswer, answer);
  141. exit(4);
  142. }
  143. //решение квадратного уравнения
  144. if (Discriminant == 0)
  145. {
  146. float x = -b / (2 * a);//нахождение корней уравнения
  147. sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s %5.3f %s %5.3f", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0 имеет 1 решение \nx = ", x, "\nДискриминант = ", Discriminant);//запись строки
  148. writeWinApi(thisAnswer, answer);
  149. printf("Решение вида (%5.3f)*x^2 + (%5.3f)*x + (%5.3f) = 0 имеет 1 решение \nx = %5.3f\nДискриминант = %5.3f\n", a, b, c, x, Discriminant);
  150. }
  151. else
  152. {
  153. //нахождение корней уравнения
  154. float x1 = (-b + sqrt(Discriminant)) / (2 * a);
  155. float x2 = (-b - sqrt(Discriminant)) / (2 * a);
  156. sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s %5.3f %s %5.3f %s %5.3f", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0 имеет 2 решения \nx1 = ", x1, ", x2 = ", x2, "\nДискриминант = ", Discriminant);//запись строки
  157. writeWinApi(thisAnswer, answer);
  158. printf("Решение вида (%5.3f)*x^2 + (%5.3f)*x + (%5.3f) = 0 имеет 2 решения \nx1 = %5.3f, x2 = %5.3f\nДискриминант = %5.3f\n", a, b, c, x1, x2, Discriminant);
  159. }
  160. }