Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
d31m03
0 / 0 / 0
Регистрация: 24.11.2015
Сообщений: 18
#1

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

22.06.2016, 03:28. Просмотров 389. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Закрытие потока - ошибка "Неверный дескриптор" (C (СИ)):

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

Функция замены ":" на "_" в названии файла и ошибка "undefined reference to 'strcat'" - C (СИ)
Добрый день,прошу помочь мне с такой проблемой: В общем есть функция,работающая с именем файла,которая меняет в имени файла &quot;:&quot; на &quot;_&quot; ...

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

Сортировка подсчетом и ошибка "Невозможно преобразовать "void*" в "int*" - C (СИ)
Мне нужно отсортировать одномерный массив с помощью алгоритма сортировки, однако возникает ошибка &quot;error C2440: инициализация: невозможно...

Ошибка в 3 строчках: Синтаксическая ошибка: отсутствие ";" перед "тип" - C (СИ)
Вот написал я: #include &quot;locale.h&quot; int main() { setlocale(LC_ALL, &quot;&quot;); char *str = &quot;образец&quot;; return 0; ...

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

4
HighPredator
5645 / 1962 / 373
Регистрация: 10.12.2010
Сообщений: 5,686
Записей в блоге: 3
22.06.2016, 08:45 #2
У вас проблема в следующем: после того, как вы перенаправили stdout в файл, вы закрыли его же с помощью fclose. А затем пытаетесь выводить printf-ом в консоль по закрытому дескриптору. По хорошему, перенаправление так делать нельзя ибо, как в вашем случае, вывод в stdout обратно очень тяжело восстановить. Портируемого способа это сделать нет.
0
shvyrevvg
496 / 475 / 185
Регистрация: 12.05.2016
Сообщений: 1,387
22.06.2016, 08:46 #3
Цитата Сообщение от d31m03 Посмотреть сообщение
C
1
fclose(fi);
Может все-таки:
C
1
fclose(stdout);
0
HighPredator
5645 / 1962 / 373
Регистрация: 10.12.2010
Сообщений: 5,686
Записей в блоге: 3
22.06.2016, 08:53 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Может быть в качестве фикса вам поможет следующее:
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
Привет! Вот еще темы с ответами:

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

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

Error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "A" - C (СИ)
пишет: (20): error C2146: синтаксическая ошибка: отсутствие &quot;;&quot; перед идентификатором &quot;A&quot; (27): error C2146: синтаксическая ошибка:...

Ввести структуру "историческое событие" с полями "число", "месяц", "год", "событие" - C (СИ)
Ввести структуру ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ. Составить и протестировать функции a. ввода исторического...


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

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

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