Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
d31m03
0 / 0 / 0
Регистрация: 24.11.2015
Сообщений: 18
#1

Закрытие потока - ошибка "Неверный дескриптор"

22.06.2016, 03:28. Просмотров 915. Ответов 4
Метки нет (Все метки)

Здравствуйте, форумчане.
есть программа:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# 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");
}
которая в конце концов должна вывести результат в файл:
C
1
2
3
4
5
6
7
8
9
10
11
            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;
            }
Но почему-то при таком коде в консоли выдаёт ошибку "Неверный дескриптор", хотя в файл вывод осуществляется. Но проблема в том, что работа программы останавливается. Подскажите пожалуйста, в чем проблема?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2016, 03:28
Ответы с готовыми решениями:

Функция freopen(stdout) - "неверный дескриптор"
Здравствуйте! У Меня проблема с функцией freopen с использованием stdout... Я...

Функция замены ":" на "_" в названии файла и ошибка "undefined reference to 'strcat'"
Добрый день,прошу помочь мне с такой проблемой: В общем есть...

Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость", "Цена"
Создать запись &quot;Двигатель&quot;, которая содержит элементы &quot;Название&quot;, &quot;Мощность&quot;,...

Сортировка подсчетом и ошибка "Невозможно преобразовать "void*" в "int*"
Мне нужно отсортировать одномерный массив с помощью алгоритма сортировки,...

Ошибка в 3 строчках: Синтаксическая ошибка: отсутствие ";" перед "тип"
Вот написал я: #include &quot;locale.h&quot; int main() { setlocale(LC_ALL, &quot;&quot;);...

4
HighPredator
5679 / 1998 / 721
Регистрация: 10.12.2010
Сообщений: 5,750
Записей в блоге: 3
22.06.2016, 08:45 #2
У вас проблема в следующем: после того, как вы перенаправили stdout в файл, вы закрыли его же с помощью fclose. А затем пытаетесь выводить printf-ом в консоль по закрытому дескриптору. По хорошему, перенаправление так делать нельзя ибо, как в вашем случае, вывод в stdout обратно очень тяжело восстановить. Портируемого способа это сделать нет.
0
shvyrevvg
523 / 496 / 255
Регистрация: 12.05.2016
Сообщений: 1,438
22.06.2016, 08:46 #3
Цитата Сообщение от d31m03 Посмотреть сообщение
C
1
fclose(fi);
Может все-таки:
C
1
fclose(stdout);
0
HighPredator
5679 / 1998 / 721
Регистрация: 10.12.2010
Сообщений: 5,750
Записей в блоге: 3
22.06.2016, 08:53 #4
Лучший ответ Сообщение было отмечено d31m03 как решение

Решение

Может быть в качестве фикса вам поможет следующее:
C
1
stdout = fdopen(1, "w");
но, может и не пойти, т.к. после fclose дескриптор вывода 1 может не существовать (формально не должен, так что скорее всего не будет).

Добавлено через 2 минуты
Цитата Сообщение от shvyrevvg Посмотреть сообщение
Может все-таки:
Без разницы. freopen вернет дескриптор stdout-а. В этом легко убедиться напечатав адреса этих указателей на экран.
2
d31m03
0 / 0 / 0
Регистрация: 24.11.2015
Сообщений: 18
22.06.2016, 18:54  [ТС] #5
Спасибо большое))
0
22.06.2016, 18:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 18:54

VS2013 выдаёт ошибку Ошибка 1 error C2079: "d" использует неопределенный struct "DATE"
Привет всем. Подскажите пожалуйста, почему VS2013 выдаёт ошибку Ошибка 1 error...

Динамическая память. Ошибка С2143 пишет отсутствие ";" перед "тип" (Visual Studio 2010)
Это код filesIO.c Чтение данных для выч. модуля программы из файла (вектора...

Списки. Ошибка "используется потенциально неинициализированная локальная переменная-указатель "t""
В 35-й выдает ошибку &quot;используется потенциально неинициализированная локальная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru