Вопрос:

C fopen vs open

c linux unix file-io fopen

135331 просмотра

11 ответа

2971 Репутация автора

Есть ли какая-либо причина (кроме синтаксических), которую вы хотите использовать

FILE *fdopen(int fd, const char *mode);

или же

FILE *fopen(const char *path, const char *mode);

вместо

int open(const char *pathname, int flags, mode_t mode);

при использовании C в среде Linux?

Автор: LJM Источник Размещён: 01.11.2009 09:49

Ответы (11)


11 плюса

77659 Репутация автора

Если у вас есть FILE *, вы можете использовать такие функции , как fscanf, fprintfи fgetsт.д. Если у вас есть только дескриптор файла, вы ограничены (но , вероятно , быстрее) подпрограммы ввода и вывода read, и writeт.д.

Автор: dreamlax Размещён: 01.11.2009 09:53

44 плюса

34023 Репутация автора

open()это низкоуровневый вызов os. fdopen()преобразует дескриптор файла os-уровня в FILE-абстракцию языка C более высокого уровня. fopen()звонит open()в фоновом режиме и дает вам FILE-указатель напрямую.

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

Автор: Emil H Размещён: 01.11.2009 09:53

10 плюса

54130 Репутация автора

Если вы не являетесь частью 0.1% приложений, где использование openявляется фактическим преимуществом производительности, действительно нет веской причины не использовать fopen. Что fdopenкасается, если вы не играете с файловыми дескрипторами, вам не нужен этот вызов.

Придерживайтесь fopenи его семейство методов ( fwrite, fread, fprintf, и др) , и вы будете очень довольны. Также важно, что другие программисты будут довольны вашим кодом.

Автор: user7116 Размещён: 01.11.2009 09:58

205 плюса

39753 Репутация автора

Решение

Во-первых, нет особо веских оснований для использования, fdopenесли fopenэто вариант и openявляется другим возможным выбором. Вы не должны были использовать openэтот файл в первую очередь, если хотите FILE *. Поэтому включение fdopenв этот список неверно и сбивает с толку, потому что это не очень похоже на другие. Теперь я перейду к его игнорированию, потому что важное различие здесь происходит между стандартом C FILE *и файловым дескриптором, специфичным для ОС.

fopenВместо этого есть четыре основные причины open.

  1. fopenпредоставляет вам буферизацию ввода-вывода, которая может оказаться намного быстрее, чем то, с чем вы работаете open.
  2. fopen перевод строки заканчивается, если файл не открывается в двоичном режиме, что может быть очень полезно, если ваша программа когда-либо портируется в среду, отличную от Unix.
  3. A FILE *дает вам возможность использовать fscanfи другие функции stdio.
  4. Ваш код может когда-нибудь быть перенесен на другую платформу, которая поддерживает только ANSI C и не поддерживает эту openфункцию.

По-моему, перевод строк, заканчивающийся переводом, чаще всего мешает вам, чем помогает вам, а синтаксический анализ fscanfнастолько слаб, что вы неизбежно в конечном итоге бросаете его в пользу чего-то более полезного.

И большинство платформ, поддерживающих C, имеют openфункцию.

Это оставляет буферный вопрос. В местах, где вы в основном читаете или записываете файл последовательно, поддержка буферизации действительно полезна и улучшает скорость. Но это может привести к некоторым интересным проблемам, в которых данные не попадают в файл, когда вы ожидаете, что он будет там. Вы должны помнить fcloseили fflushв подходящее время.

Если вы делаете поиски (ака fsetposили fseekвторая из которых немного сложнее использовать стандартным образом), полезность буферизации быстро снижается.

Разумеется, моя предвзятость заключается в том, что я стараюсь работать с сокетами очень много, и есть тот факт, что вы действительно хотите делать неблокирующий IO (который FILE *полностью не поддерживает каким-либо разумным образом) без буферизации вообще и часто имеют сложные требования к синтаксическому анализу, которые действительно меняют мои восприятия.

Автор: Omnifarious Размещён: 01.11.2009 10:00

7 плюса

698 Репутация автора

Использование open, read, write означает, что вам приходится беспокоиться о сигнальных вторжениях.

Если вызов был прерван обработчиком сигнала, функции вернут -1 и установят errno в EINTR.

Таким образом, правильный способ закрыть файл будет

while (retval = close(fd), retval == -1 && ernno == EINTR) ;
Автор: digy Размещён: 05.05.2010 09:31

1 плюс

11 Репутация автора

Я изменил на open () из fopen () для моего приложения, потому что fopen вызывал двойные чтения каждый раз, когда я запускал fopen fgetc. Двойное чтение искажало то, что я пытался выполнить. open () просто делает то, что вы просите об этом.

Автор: Ersatz Splatt Размещён: 03.04.2012 07:24

-1 плюса

47 Репутация автора

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

1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.

это способ поведения функции fopen
есть некоторые причины в процессе буферизации, это может быть тайм-аут. поэтому при сравнении fopen (высокий уровень ввода-вывода ) для открытия системного вызова (низкоуровневого ввода-вывода), и это быстрее, чем fopen .

Автор: prashad Размещён: 22.10.2014 04:20

4 плюса

561 Репутация автора

open()является системным вызовом и специфичен для системы на основе Unix и возвращает файловый дескриптор. Вы можете написать файл filedescriptor, используя write()другой системный вызов.
fopen()это вызов функции ANSI C, который возвращает указатель на файл и переносится в другую ОС. Мы можем записать указатель на файл с помощью fprintf.

В Unix:
вы можете получить указатель файла из filedescriptor, используя:
fP = fdopen(fD, "a");
вы можете получить файловый дескриптор из указателя файла, используя:
fD = fileno (fP);

Автор: Arun Chettoor Размещён: 09.01.2015 02:55

4 плюса

607 Репутация автора

open () будет вызываться в конце каждой из функций семейства fopen () . open () - системный вызов, а функция fopen () предоставляется библиотеками в качестве функций обертки для простого пользователя

Автор: theadnangondal Размещён: 09.01.2015 07:03

23 плюса

1629 Репутация автора

fopen vs open in C

1) fopenявляется библиотечной функцией, а openявляется системным вызовом .

2) fopenобеспечивает буферный ввод - вывод , который быстрее , по сравнению с openкоторой не буферными .

3) fopenявляется портативным , а openне портативными ( открытым является средой конкретного ).

4) fopenвозвращает указатель на структуру FILE (FILE *) ; openвозвращает целое число, которое идентифицирует файл.

5) A FILE *дает вам возможность использовать функции fscanf и другие функции stdio.

Автор: Yogeesh H T Размещён: 26.11.2015 12:07

2 плюса

76 Репутация автора

Зависит также от того, какие флаги необходимы для открытия. В отношении использования для записи и чтения (и переносимости) f * следует использовать, как указано выше.

Но если в основном вы хотите указать больше стандартных флагов (например, флагов rw и append), вам придется использовать API-интерфейс платформы (например, POSIX open) или библиотеку, которая абстрагирует эти детали. В C-стандарте нет таких флагов.

Например, вы можете открыть файл, только если он выйдет. Если вы не укажете флаг создания, файл должен существовать. Если вы добавите эксклюзив для создания, он создаст файл только в том случае, если он не существует. Есть еще много.

Например, в системах Linux есть интерфейс LED, открытый через sysfs. Он отображает яркость светодиода через файл. Запись или чтение числа в виде строки в диапазоне от 0 до 255. Конечно, вы не хотите создавать этот файл и писать только в том случае, если он существует. Теперь классная вещь: используйте fdopen для чтения / записи этого файла с помощью стандартных вызовов.

Автор: Ritualmaster Размещён: 11.03.2016 10:45
Вопросы из категории :
32x32