Функции С и C++, библиотек C++Builder, API Windows_______________845

Функция _fsopen открывает файл filename совместного доступа для несколь-
ких процессов, определяемого параметрами shflag и mode. Флаги совместного до-
ступа, из которых может формироваться shflag, см. в разделе 14.12.1. Параметр
mode аналогичен такому же параметру функции fopen. При работе с этой функ-
цией в DOS предварительно должна быть загружена программа SHARE.EXE.

Функция freopen связывает с открытым потоком stream файл с именем filena-
me в режиме mode. Отличие от функции fopen заключается только в том, что по-
ток stream уже был ранее открыт. Это позволяет, в частности, переназначить стан-
дартный поток. Например, оператор

FILE *F = freopen("output.txt", "wt", stdout);

перенаправляет стандартный выходной поток stdout в текстовый файл «out-
put.txt». Все последующие выводы в поток stdout будут в действительности на-
правляться в этот файл.

Функция _fdopen осуществляет связь между файлами, открытыми с дескрип-
торами (об этом подходе будет рассказано в разделе 14.12.3) и потоками типа
FILE. Например, оператор

FILE * stream = fdopen(handle, "w");

связывает ранее открытый файл с дескриптором handle со структурой потока stre-
am.

Обратное преобразование — получение дескриптора файла, связанного со
структурой FILE, осуществляет функция _fileno. В приведенном ниже примере
создается файл «Test.txt» для записи и определяется его дескриптор.

FILE * stream;

int handle;

stream = fopen("Test.txt", "w"); // создание файла
handle = fileno(stream);        // определение дескриптора

fclose(stream);                  // закрытие файла

Открываемые рассмотренными функциями потоки буферизуются, т.е. обмен
информацией происходит не непосредственно с файлами, а с промежуточными бу-
ферами, расположенными в оперативной памяти. Информация переписывается из
буфера в файл только при переполнении буфера, или при закрытии файла, или
функциями fflush и _flushall. Первая из них действует на буфер указанного вы-
ходного потока, вторая — на буферы всех входных и выходных потоков. Для вход-
ного потока функция очищает буфер, а для выходного — немедленно сбрасывает
все содержимое в поток, после чего буфер очищается. Потоки остаются открытыми
и буферы готовы к приему новой информации.

Программа автоматически осуществляет буферизацию всех потоков. Однако,
этим процессом можно управлять функциями setbuf и setvbuf. Если в функции
setbuf параметр buf задать равным NULL, то буферизация потока производиться
не будет. Это может замедлить работу с потоком, но зато обеспечит немедленную
передачу информации без ожидания того, чтобы буфер переполнился. Если же buf
указывает на массив символов, то именно этот массив будет использоваться для
полной буферизации потока stream вместо буфера по умолчанию. Размер буфера
может достигать значения BUFSIZ, определенного в файле stdio.h. Например:

char outbuf[BUFSIZ];

setbuf(F, outbuf);

Фукнция setbuf должна вызываться сразу поле открытия потока или сразу по-
сле вызова функции fseek (см. раздел 14.12.4), устанавливающей позицию указа-
теля потока. В противном случае вызов setbuf может приводить к непредсказуе-
мым результатам.