Закрытие потока - ошибка "Неверный дескриптор" - 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. Открывается файл с дескриптором 1 в режиме записи (fdopen(1, w)).
  2. Полученный дескриптор сохраняется в переменной stdout.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы