Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Если убрать fclose в функции a то всё хорошо, иначе ошибка. ПОЧЕМУ???

Grüne im Grünen Ученик (71), на голосовании 1 год назад
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void a() {
FILE* fp;
fp = fopen("name.txt", "r");
fclose(fp);
}

void b() {
FILE* fp;
fp = fopen("name.txt", "w");
fclose(fp);
}
int main() {
a();
b();

}

На самом деле у меня программа больше, но проблема заключается именно в этом и мне нужно две отдельные функции. Как сделать так чтобы закрыть файлы в двух функциях сразу?



Голосование за лучший ответ
Era play Гуру (2744) 1 год назад
Ошибка возникает из-за того, что вы используете не защищенные функции для работы с файлами (fopen, fclose) без предварительного определения макроса _CRT_SECURE_NO_WARNINGS. Это предупреждение, которое может быть вызвано компилятором, чтобы сообщить об использовании функций, которые могут привести к уязвимостям безопасности.

Макрос _CRT_SECURE_NO_WARNINGS можно определить в начале вашего файла, чтобы отключить предупреждения компилятора, связанные с использованием этих функций
Вот пример использования:
 #define _CRT_SECURE_NO_WARNINGS 
 #include  
 void a() { 
     FILE* fp; 
     fp = fopen("name.txt", "r"); 
     fclose(fp); 
 } 
 void b() { 
     FILE* fp; 
     fp = fopen("name.txt", "w"); 
     fclose(fp); 
 } 
 int main() { 
     a(); 
     b(); 
 } 
Grüne im GrünenУченик (71) 1 год назад
У меня точно так же
Era play Гуру (2744) Grüne im Grünen, тогда проверьте есть ли файл в каталоге и есть ли у вас доступ к чтению этого файла
Era playГуру (2744) 1 год назад
Также иногда некоторые функции работают асинхронно, поэтому попробуйте добавиться условия if(notnull)
Вячеслав Гуру (4536) 1 год назад
у тебя файл не открылся
Grüne im GrünenУченик (71) 1 год назад
Как так
ВячеславГуру (4536) 1 год назад
проверяй на NULL
Grüne im GrünenУченик (71) 1 год назад
fp в первом случае не равно NULL, значит открылось всё О_о
Grüne im Grünen, ВСЕГДА следует проверять такие вещи, как открытие файла и, по возможности, следует проверять его закрытие (особенно если вы открывали файл на запись). Минимально адекватный код будет выглядеть примерно так:
 int fn_a( const char* filename )
{
    int result = 0;
    FILE* fp;
    fp = fopen( filename, "r" );
    if( fp )
    {
        // Работаем
        if( fclose( fp ) == 0 )
        {
            result++; 
        }
        else
        {
            perror("fn_a fclose");
        }
    }
    else
    {
        perror("fn_a fopen");
    }
    return result;
} 
По хорошему же, надо в случае неудачи fopen и fclose проверять еще переменную errno на предмет ошибки EINTR, которая возникает в случае, если функция была прервана поступившим сигналом.
Grüne im GrünenУченик (71) 1 год назад
Действительно, спасибо большое ?
Grüne im GrünenУченик (71) 1 год назад
Там должен был быть не вопрос а смайлик ну ладно
Серый Верный Профи (672) 1 год назад
Ну такая специфика Си, к этому нужно привыкнуть. Заметь, кроме выделения динамической памяти в функции все умирает вместе с завершением функции. Не нужно дублировать закрытие файла.
Похожие вопросы