123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- #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);
- }
- }
|