Fopen без Fclose в C - PullRequest
       0

Fopen без Fclose в C

6 голосов
/ 28 июля 2010

Что произойдет, если я открою файл, используя fopen некоторое n количество раз без вызова fclose для него?

Могут ли возникнуть проблемы с переполнением буфера?

Ответы [ 5 ]

13 голосов
/ 28 июля 2010

Если вы продолжите fopen без fclose, то в конечном итоге ваши будущие звонки на fopen начнут давать сбой. Для вашей программы доступно ограниченное количество файловых дескрипторов.

См. Этот связанный вопрос SO .

6 голосов
/ 28 июля 2010

Вы тратите впустую основные файловые дескрипторы. Пожалуйста, своевременно закрывайте все открытые файлы, чтобы избежать утечки ресурсов.

2 голосов
/ 28 июля 2010

Если вы продолжите открывать файлы, не закрывая их, то в какой-то момент у вас кончатся файловые дескрипторы, либо на уровне приложения, либо на уровне ОС, и все дальнейшие попытки открыть файл будут неудачными.

1 голос
/ 28 июля 2010

Как уже упоминалось, вы не хотите пропускать файловые дескрипторы.Но - это нормально , чтобы открыть один файл несколько раз.Файловые дескрипторы независимы и не будут мешать друг другу (при условии, что вы просто читаете, а не записываете в файл).

#include <stdio.h>

int main()
{
    FILE* f1 = fopen("/tmp/foo.txt", "rb");
    FILE* f2 = fopen("/tmp/foo.txt", "rb");
    FILE* f3 = fopen("/tmp/foo.txt", "rb");
    FILE* f4 = fopen("/tmp/foo.txt", "rb");

    char buf1[32] = { 0, };
    char buf2[32] = { 0, };
    char buf3[32] = { 0, };
    char buf4[32] = { 0, };

    fread(buf1, 1, sizeof(buf1) - 1, f1);
    fread(buf2, 1, sizeof(buf2) - 1, f2);
    fread(buf3, 1, sizeof(buf3) - 1, f3);
    fread(buf4, 1, sizeof(buf4) - 1, f4);

    printf("buf1 = '%s'\n", buf1);
    printf("buf2 = '%s'\n", buf2);
    printf("buf3 = '%s'\n", buf3);
    printf("buf4 = '%s'\n", buf4);

    fclose(f1);
    fclose(f2);
    fclose(f3);
    fclose(f4);

    return 0;
}

Дает вывод, подобный:

$ ./fopen 
buf1 = '0123456789ABCDEFGHIJ0123456789a'
buf2 = '0123456789ABCDEFGHIJ0123456789a'
buf3 = '0123456789ABCDEFGHIJ0123456789a'
buf4 = '0123456789ABCDEFGHIJ0123456789a'
1 голос
/ 28 июля 2010

Помимо потери файловых дескрипторов процесса, как отвечали другие, вы также тратите память , поскольку каждый файловый поток управляет буферами ввода / вывода, которые выделяются внутри libc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...