Если «указатель файла» и «поток» действительно используются в качестве строгих синонимов, то:
FILE *fp = NULL;
определяет поток , который (еще) не связан ни с одним периферийным устройством. И при этом (пока) это не связано с каким-либо источником или назначением данных.
Если бы вы спросили Брайана Кернигана или покойного Дениса Рича ie: "Действительно ли fp
там пара?", Они я бы сказал: «Ну, может, нет. Это поток, когда он использует для ввода-вывода - когда вы успешно открываете его, пока не закроете его. Это не имеет большого значения, говорите ли вы, что это поток когда он не используется, или просто указатель файла. "
Указатель файла (или поток), который используется для ввода / вывода, является программным представлением c в C некоторого источника или назначения данные. Этим источником или назначением может быть или быть подключено периферийное устройство, такое как USB-накопитель, SSD или жесткий диск, том или лента на ленте. Или это не так. Определение C не определяет и не ограничивает физическую реализацию источников или назначений данных, которые FILE *
может представлять . Вот почему в книге говорится, что источник или назначение данных может быть связано с диском или другим периферийным устройством.
Стандартная библиотека C предоставляет только функцию fopen
в <stdio,h>
(и его укрепленном варианте fopen_s
) как способ создания потока с нуля. 1 И он предоставляет хорошо известные готовые FILE *
потоки stdin
, stdout
и stderr
. Таким образом, потоки, предоставляемые <stdio.h>
, обычно, но не обязательно, связаны с периферийными устройствами.
C библиотеки, отличные от стандартной библиотеки, могут предоставить вам функции, возвращающие поток FILE *
, который не связан с периферийным устройством. Например, библиотека Linux C предлагает вам fmemopen
и друзей, которые предоставляют FILE *
I / O для областей памяти .
Вы можете даже читать или записывать FILE *
потоков в память, используя только <stdio.h>
. Linux позволяет легко создавать виртуальную файловую систему в памяти tmpfs
. Затем вы можете писать программы исключительно в стандарте C, которые выполняют обычный FILE *
ввод / вывод в вашей файловой системе tmpfs
, и ни одна из них не будет связана с периферийным устройством. C не знает и не заботится о реализации файловой системы.
[1] Также есть
freopen
и
freopen_s
, которые закрывают существующий поток и открывают его снова с новым именем файла.