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

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

Grüne im Grünen Ученик (32), на голосовании 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 Мастер (1831) 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Ученик (32) 1 месяц назад
У меня точно так же
Era play Мастер (1831) Grüne im Grünen, тогда проверьте есть ли файл в каталоге и есть ли у вас доступ к чтению этого файла
Era playМастер (1831) 1 месяц назад
Также иногда некоторые функции работают асинхронно, поэтому попробуйте добавиться условия if(notnull)
Вячеслав Гуру (3627) 1 месяц назад
у тебя файл не открылся
Grüne im GrünenУченик (32) 1 месяц назад
Как так
ВячеславГуру (3627) 1 месяц назад
проверяй на NULL
Grüne im GrünenУченик (32) 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Ученик (32) 1 месяц назад
Действительно, спасибо большое ?
Grüne im GrünenУченик (32) 1 месяц назад
Там должен был быть не вопрос а смайлик ну ладно
Серый Верный Знаток (458) 1 месяц назад
Ну такая специфика Си, к этому нужно привыкнуть. Заметь, кроме выделения динамической памяти в функции все умирает вместе с завершением функции. Не нужно дублировать закрытие файла.
Похожие вопросы