Закрытие потока - ошибка "Неверный дескриптор" - 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.