#include "Header.h" void createFileWinApi(char* path) { HANDLE FileTask;//указатель на файл FileTask = CreateFileA(//создание файла path, //название GENERIC_READ | GENERIC_WRITE | GENERIC_ALL,//доступ на чтение и запись FILE_SHARE_WRITE | FILE_SHARE_READ,//разделяемый доступ для письма и чтения NULL,//безопасность CREATE_ALWAYS,//описание - всегда создает новый файл FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//атрибуты файла 0);//файл шаблона if (GetLastError() == 2) { printf("Не удалось создать файл\n");//вывод ошибки в консоль exit(1);//код ошибки } CloseHandle(FileTask); } void deleteFileWinApi(char* path) { if (GetFileAttributesA(path) != -1)//если файл существует, т.е. возвращаемое значение GetFileAttributesA != INVALID_FILE_ATTRIBUTES { DeleteFileA(path);//удаляем файл } } void writeWinApi(char* path, char* str) { deleteFileWinApi(path); //удляем старый файл если такой есть createFileWinApi(path); //создаем новый файл HANDLE FileTask;//указатель на файл FileTask = CreateFileA(//создание файла path, //название GENERIC_READ | GENERIC_WRITE | GENERIC_ALL,//доступ на чтение и запись FILE_SHARE_WRITE | FILE_SHARE_READ,//разделяемый доступ для письма и чтения NULL,//безопасность CREATE_NEW,//описание - всегда создает новый файл FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//атрибуты файла 0);//файл шаблона if (GetLastError() == 2) { printf("Не удалось открыть файл\n");//вывод ошибки в консоль exit(1);//код ошибки } char* info_buf = calloc(1000, sizeof(char)); char* buffer = calloc(strlen(str)+1,sizeof(char)); //буфер для записи содержимого файла FileTask = OpenFile(//открытие файла path,//путь откуда открываем info_buf,//структура открываемого файла OF_WRITE | OF_READWRITE);//создает файл и открывает для записи if (GetLastError() == -1) { printf("Ошибка открытия файла"); exit(1); } WriteFile(//запись информации в новый файл FileTask,//куда str,//что strlen(str),//объем NULL,//фактический размер NULL);//флаг доступа if (GetLastError() == 6)//ERROR_INVALID_HANDLE - ошибка записи { printf("Oшибка записи в файл\n"); exit(6); } CloseHandle(FileTask);//отпускаем указатель } char* readWinApi(char* path) { HANDLE FileTask;//указатель на файл FileTask = CreateFile(//создание файла path, //название GENERIC_READ | GENERIC_WRITE | GENERIC_ALL,//доступ на чтение и запись FILE_SHARE_WRITE | FILE_SHARE_READ,//разделяемый доступ для письма и чтения NULL,//безопасность OPEN_EXISTING | OPEN_ALWAYS,//описание - всегда создает новый файл FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//атрибуты файла 0);//файл шаблона if (GetLastError() == 2) { printf("Не удалось открыть файл\n");//вывод ошибки в консоль exit(1);//код ошибки } char* info_buf = calloc(1000, sizeof(char)); char* buffer = calloc(1000, sizeof(char)); //буфер для записи содержимого файла FileTask = OpenFile(//открытие файла path,//путь откуда открываем info_buf,//структура открываемого файла OF_READ);//создает файл и открывает для чтения и записи if (GetLastError() == -1) { printf("Ошибка открытия файла"); exit(1); } ReadFile(//чтение файла FileTask,//указатель на файл buffer,//куда записываются файлы 1000,//объем данных не больше размера буфера NULL,//фактический размер записываемых данных NULL);//флаг режима к доступу if (GetLastError() == 1784 || GetLastError() == 6) { printf("ошибка чтения файла"); exit(5); } CloseHandle(FileTask);//отпускаем указатель return buffer; } void withWinApi() { char* thisPath = PATH2; char* thisAnswer = ANSWERTASK2; deleteFileWinApi(thisAnswer);//удаляем файл с ответом, чтобы в случаев возникновения ошибки файла не было printf("\nВведите коэфициенты уравнения:"); char* str = calloc(1000, sizeof(char)); gets(str); writeWinApi(thisPath, str); char* buffer = readWinApi(thisPath); //объявление переменных float a; float b; float c; int CODE_PARAM = sscanf(buffer, "%f%f%f", &a, &b, &c);//заполнение переменных countArg(CODE_PARAM); float Discriminant = b * b - 4 * c * a;//нахождение дискриминанта char* answer = calloc(1000, sizeof(char)); if (Discriminant < 0)//если дискриминант отрицательный { printf("Дискриминант меньше 0. Решения нет\n");//вывод ошибки в консоль sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s %5.3f", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0\nРешения не имеет, поскольку имеет отрицательный дискриминант = ", Discriminant);//запись строки writeWinApi(thisAnswer, answer); exit(3);//код ошибки } //проверка первого аргумента на плешивость if (a == 0) { printf("Попытка деления на 0\n"); sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0\n Попытка деления на 0");//запись строки writeWinApi(thisAnswer, answer); exit(4); } //решение квадратного уравнения if (Discriminant == 0) { float x = -b / (2 * a);//нахождение корней уравнения 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);//запись строки writeWinApi(thisAnswer, answer); printf("Решение вида (%5.3f)*x^2 + (%5.3f)*x + (%5.3f) = 0 имеет 1 решение \nx = %5.3f\nДискриминант = %5.3f\n", a, b, c, x, Discriminant); } else { //нахождение корней уравнения float x1 = (-b + sqrt(Discriminant)) / (2 * a); float x2 = (-b - sqrt(Discriminant)) / (2 * a); 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);//запись строки writeWinApi(thisAnswer, answer); 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); } }