LINUX.ORG.RU

open fopen


0

0

тупой вопрос: можно ли смешивать вызовы fopen/fread/fwrite/fclose и open/read/write/close, чем они отличаются и что лучше (в разных планах) ?

anonymous

Смешивать можно. Но в функциях f* используются указатели на файл типа FILE*, а в остальных - типа int.
Когда открываешь файл через fopen есть способ получить его идентификатор по его FILE* указателю, но не наоборот.

UncleAndy ★★★
()

8.4 Дескрипторы и Потоки

Определяя дескриптор файла с помощью open, Вы можете создавать поток
для него функцией fdopen. Вы можете получить основной описатель файла
для существующего потока функцией fileno. Эти функции объявлены в
заглавном файле 'stdio.h'.

-Функция: FILE * fdopen (int filedes, const char *opentype)
Функция fdopen возвращает новый поток для описателя файла
filedes. Opentype аргумент интерпретируется таким же образом
как в функции fopen (см. Раздел 7.3 [Открытие Потоков]), за
исключением того, что опция 'b' не разрешается; это оттого, чт
GNU не делает никакого различия между текстом и двоичными
файлами. Также, 'w' и 'w+' не вызывают усечение файла; они
воздействуют только при открытии файла, а в этом случае, файл
уже открыт. Вы должны удостовериться, что opentype аргумент
соответствует фактическому режиму дескриптора файла.

Возвращаемое значение - новый поток. Если поток не может быть
создан (например, если режимы для файла, обозначенного
дескриптором файла не разрешают доступ, заданный opentype
аргументом), взамен возвращается пустой указатель.

Для примера, показывающего использование функции fdopen, см.
Раздел 10.1 [Создание Канала].

-Функция: int fileno (FILE *stream)
Эта функция возвращает описатель файла, связанный с указанным
потоком. Если обнаружена ошибка (например, если поток не
допустим) или если поток, не делает ввод - вывод в файл, filen
возвращает - 1.

Имеются также символические константы, определенные в
'unistd.h' для описателей файла, принадлежащих к стандартным
потокам stdin, stdout, и stderr; см. Раздел 7.2 [Стандартные
Потоки].

STDIN_FILENO
Эта макрокоманда имеет значение 0, которое является
дескриптором файла для стандартного ввода.

STDOUT_FILENO
Эта макрокоманда имеет значение 1, которое является
дескриптором файла для стандартного вывода.

STDERR_FILENO
Эта макрокоманда имеет значение 2, которое является
дескриптором файла для стандартного вывода ошибки.

8.5 Опасности Смешивания Потоков и Дескрипторов

Вы можете иметь многочисленные дескрипторы файла и потоки (назывем и
потоки и дескрипторы 'каналами', для краткости), связанными с одним и
тем же файлом, но Вы должны соблюдать осторожность, чтобы избежать
путаницы между каналами. Имеются два случая, для рассмотрения:
связанные каналы, которые совместно используют одино значение файлово
позиции, и независимые каналы которые имеют свои собственные файловые
позиции.

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

SadStork
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.