Как открыть fdopen с тем же режимом и флагами?

Я хотел бы иметь тип FILE* для использования fprintf. Мне нужно использовать fdopen, чтобы получить FILE* вместо open, который возвращает int. Но можем ли мы сделать то же самое с fdopen и open? (Я никогда не использовал fdopen)

Я хотел бы сделать fdopen, который делает то же самое, что и:

open("my_file", 0_CREAT | O_RDWR | O_TRUNC, 0644);

person Elfayer    schedule 27.02.2013    source источник


Ответы (3)


fdopen принимает дескриптор файла, который ранее мог быть возвращен open, так что это не проблема.

Просто open ваш файл получает дескриптор, а затем fdopen этот дескриптор.

fdopen просто создает буферизованный в пользовательском пространстве поток, используя любой тип дескриптора, который поддерживает операции read и write.

person Blagovest Buyukliev    schedule 27.02.2013
comment
Не забывайте, что режимы для fdopen должны быть совместимы с режимами файлового дескриптора. - person Jite; 27.02.2013

fdopen()использовать дескриптор файла для указателя на файл:

Функция fdopen() связывает поток с дескриптором файла. Дескрипторы файлов получаются из open(), dup(), creat() или pipe(), которые открывают файлы, но не возвращают указатели на поток структуры FILE. Потоки необходимы почти для всех подпрограмм библиотеки stdio.

FILE* fp = fdopen(fd, "w");

этот пример кода может помочь вам больше, если вы хотите использовать fprintf():

int main(){
 int fd;
 FILE *fp;
 fd = open("my_file",O_WRONLY | O_CREAT | O_TRUNC);
  if(fd<0){
    printf("open call fail");
    return -1;
 }
 fp=fdopen(fd,"w");
 fprintf(fp,"we got file pointer fp bu using File descriptor fd");
 fclose(fp);
 return 0;
}

Примечание:

person Grijesh Chauhan    schedule 27.02.2013
comment
Вы не должны не закрывать файловый дескриптор после того, как использовали для него fdopen, а затем fclose. fd не дублируется, и вызов fclose закроет его. - person Jite; 27.02.2013
comment
Цитирование справочной страницы: The file descriptor is not dup'ed, and will be closed when the stream created by fdopen() is closed. См. также stackoverflow.com/questions/8417123/ - person Jite; 27.02.2013
comment
Это ничего не пишет в файле. - person Elfayer; 27.02.2013
comment
@Elfayer Это должно сработать. Попробуйте еще раз, а также вот еще один пример - person Grijesh Chauhan; 27.02.2013

Если вы ранее не получили файловый дескриптор для своего файла, лучше используйте fopen.

FILE* file = fopen("pathtoyourfile", "w+");

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

См. справочную страницу.

person bash.d    schedule 27.02.2013