Закрытие потока - ошибка "Неверный дескриптор" - C (СИ)
Формулировка задачи:
Здравствуйте.
есть программа:которая в конце концов должна вывести результат в файл:
Но почему-то при таком коде в консоли выдаёт ошибку "Неверный дескриптор", хотя в файл вывод осуществляется. Но проблема в том, что работа программы останавливается. Подскажите пожалуйста, в чем проблема?
# include <stdio.h> # include <math.h> # include <stdlib.h> # include <conio.h> # include <locale.h> # define N 6 double polov(double (*t)(double), double, double, double); double max(double (*t)(double),double,double,double); void tablica (double (*t)(double),double,double); double t1(double); double t2(double); double vivod(double m1,double m2,double x1,double x2); int main() { double a,b,c,d,e1,e2,m1,m2,x1,x2,e[N]; int i; char sw; FILE *fo,*fi; setlocale(LC_CTYPE, "Russian"); uslov: printf ("Какие исходные данные вы желаете использовать?\nНажмите 1 для ввода даных с клавиатуры.\nНажмите 2 для ввода данных из файла.\n\n"); sw = getch(); switch (sw) { case '1' : { system("cls"); printf("Вы выбрали ввод данных с клавиатуры\n"); printf("Введите диапазон отрезка для 1-ой функции (a, b) и задайте точность (e)\n"); scanf("%lf%lf%lf",&a,&b,&e1); printf("Введите диапазон отрезка для 2-ой функции (c, d) и задайте точность (e)\n"); scanf("%lf%lf%lf",&c,&d,&e2); printf("\nДля продолжения нажмите клавишу.\n"); getch(); break; } case '2' : { system("cls"); fo=fopen("isxodnieq.dat","r"); printf("Вы выбрали ввод данных из файла\nДанные взяты из файла isxodnie.dat\n"); i=0; do { fscanf(fo,"%lf",&e[i]); i++; } while (i<N); a=e[0]; b=e[1]; c=e[2]; d=e[3]; e1=e[4]; e2=e[5]; fclose(fo); printf("\nДля продолжения нажмите клавишу.\n"); getch(); break; } } do { system("cls"); printf ("Нажмите 1 если желаете посмотреть исходные данные.\nНажмите 2 если желаете посмотреть условия задания.\nНажмите 3 если желаете продолжить.\n\n"); sw = getch(); switch (sw) { case '1' : { system("cls"); printf("Вы выбрали демонстрацию исходных данных:\n\n"); printf("Диапазон отрезка для 1-ой функции %0.3f : %0.3lf и заданная точность e= %2.3lf\n", a,b,e1); printf("Диапазон отрезка для 2-ой функции %0.3f : %0.3lf и заданная точность e= %2.3lf\n\n",c,d,e2); printf("\nДля продолжения нажмите клавишу."); getch(); break; } case '2' : { system("cls"); printf("Вы выбрали демонстрацию задания:\n\n"); printf("Функция f(x) определена на отрезке от a до b.\n"); printf("Решить уравнение f(x)=0 методом половинного деления\n"); printf("и найти максимум функции f(x) методом половинного деления.\n"); printf("\nДля продолжения нажмите клавишу.\n"); getch(); break; } case '3' : system("cls"); printf("Вы отклонили демонстрацию условий.\n"); printf("\nДля продолжения нажмите клавишу.\n"); getch(); } } while (sw != '3'); system("cls"); printf("Нажмите любую цифру, если желаете выполнить задание.\n"); getch(); system("cls"); printf("Программа приступила к выполнению заданий.\n"); printf("\nДля продолжения нажмите клавишу.\n"); getch(); x1=polov (t1,a,b,e1); x2=polov (t2,c,d,e2); m1=max (t1,a,b,e1); m2=max (t2,c,d,e2); do { system("cls"); printf ("Нажмите 1 если желаете записать результаты в файл.\nНажмите 2 если желаете вывести результаты на монитор.\nНажмите 3 если желаете завершить программу.\n\n"); sw = getch(); switch (sw) { case '1' : { system("cls"); printf("Вы выбрали запись данных в файл\nДанные записаны в файл vivod.dat\n"); fi=freopen("vivod.dat","w",stdout); vivod( m1, m2, x1, x2); fclose(fi); printf("\nДля продолжения нажмите клавишу.\n"); getch(); break; } case '2' : { system("cls"); printf("Вы выбрали вывод данных на экран.\n"); vivod( m1, m2, x1, x2); printf("\nДля продолжения нажмите клавишу.\n"); getch(); break; } case '3' : { system("cls"); printf("\nПрограмма завершена.\n"); break; } } } while (sw != '4'); } double max (double(*t)(double),double a,double b,double e) { double x1,x2,q,c; c=0.01*e; do { q=(a+b)/2; x1=q-c; x2=q+c; if (t(x1)<t(x2)) a=x1; else b=x2; } while (fabs (b-a) >= e); return q; } double polov (double (*t)(double), double a, double b, double e){ float x; do { x=(a+b)/2; if ((t(a))*(t(x))<0) b=x; else a=x; } while (fabs (b-a) >= e); return x; } double t1(double x) { return sqrtf(1-x)-tan(x); } double t2(double x) { return (2+x-(x*x)); //return 0.6*(pow(3.0, x))-2.3*x-3.0; } double vivod(double m1,double m2,double x1,double x2) { printf("I\tМетод половинного деления I\n"); printf("I=====================================================I\n"); printf("I\tmax1=%lf, max2=%lf, kr1=%lf, kr2=%lf I\nI", m1, m2, x1, x2); printf("I=====================================================I\n"); return 0; } void tablica (double(*t)(double),double a,double b) { double i; for (i=a;i<=b;i+=0.1) { printf("_______________________\n"); printf("| x=%5.3lf |",i); printf("| y=%5.3lf |\n",t(i)); } printf("_______________________\n"); }
case '1' : { system("cls"); printf("Вы выбрали запись данных в файл\nДанные записаны в файл vivod.dat\n"); fi=freopen("vivod.dat","w",stdout); vivod( m1, m2, x1, x2); fclose(fi); printf("\nДля продолжения нажмите клавишу.\n"); getch(); break; }
Решение задачи: «Закрытие потока - ошибка "Неверный дескриптор"»
textual
Листинг программы
stdout = fdopen(1, "w");
Объяснение кода листинга программы
- Открывается файл с дескриптором 1 в режиме записи (fdopen(1,
w
)). - Полученный дескриптор сохраняется в переменной stdout.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д