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

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

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