Что происходит, если я открываю использование файла fopen
некоторое n количество раз без вызова fclose
на нем?
Какие-либо проблемы переполнения буфера могут возникнуть?
Если вы продолжите fopen
без fclose
, то в конечном итоге ваши будущие вызовы fopen
начнут давать сбой. Для вашей программы доступно ограниченное количество файловых дескрипторов.
Помимо бесполезной траты файловых дескрипторов для процесса, как ответили другие, вы также потратите впустую память , поскольку каждый файловый поток управляет буферами ввода / вывода, которые распределяются внутри libc
.
Как уже упоминалось, вы не хотите утечки файловых дескрипторов. Но нормально, чтобы один файл открывался несколько раз. Дескрипторы файлов независимы и не будут мешать друг другу (при условии, что вы просто читаете, а не записываете в файл).
#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'
Вы тратите впустую базовые дескрипторы файлов. Пожалуйста, закройте все открытые файлы своевременно, чтобы избежать утечки ресурсов.
Если вы продолжите открывать файлы, не закрывая их, то в какой-то момент у вас закончатся файловые дескрипторы, либо на уровне приложения, либо на уровне ОС, и все дальнейшие попытки открыть файл потерпят неудачу. .