Bir dosya tanımlayıcısından bir FILE işaretçisi nasıl elde edilir?


86

mkstemp()Bir dosya tanımlayıcı sağlayan ile uğraşıyorum, ancak üzerinden biçimlendirilmiş çıktı oluşturmak istiyorum fprintf(). Tarafından sağlanan dosya tanımlayıcısını kullanıma uygun mkstemp()bir FILE *yapıya dönüştürmenin kolay bir yolu var mı fprintf()?


Yanıtlar:


103

Kullanım fdopen():


34
Dosya tanımlayıcısını bir DOSYA'dan * almak için şunu kullanın fileno(): linux.die.net/man/3/fileno
Lee Netherton

2
fdbazı bayraklarla açılmışsa (gibi O_NONBLOCK) - fdopenyeni bayraklarla açıldıktan sonra bunlara ne olacak ? xorBirlikte mi yoksa ikame mi edilecekler ?
xealits

5
@jww: Dosya tanımlayıcıları başlangıçta ANSI C değildir.
Rufflewind

2
fdopenbirden çok kez aramak kötü midir? (tekrar tekrar çağrılan bazı işlevlerin içinde gerçekleştiğini varsayarak)
phil294

2
@xealits FILE * için seçenekler, zaten açık olan dosya tanımlayıcısının kapsamında olmalıdır. Bu nedenle, fd'yi salt okunur olarak açtıysanız ve FILE * 'yi yalnızca yazma ile açtıysanız, bir istisna atması gerekir. Daha fazla bilgi için ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
adresini ziyaret edin

28

FILE* f = fdopen(d, "w");

man fdopen çıkışı:

SİNOPSİS

fdopen()Fonksiyonu, mevcut dosya tanımlayıcı ile bir dere ilişkilendirir fildes. Akışın modu, dosya tanımlayıcının moduyla uyumlu olmalıdır. Akış ile kapatıldığında fclose(3), fildesaynı zamanda kapalıdır.


1
ANSI C'de mevcut değil
jww


-8

Bunu yapmanın standart bir yolu (veya tersi) yoktur çünkü C Standardının dosya tanımlayıcıları hakkında söyleyecek hiçbir şeyi yoktur. Özel platformunuz böyle bir mekanizma sağlayabilir veya sağlamayabilir.


17
"Standart" ile ne demek istediğine bağlı. POSIX bir standarttır.
Richard Pennington

12
Soru, dosya tanımlayıcılarla ilgiliydi. ;-)
Richard Pennington

11
@Neil> C olarak etiketlenen soru "bana C standardı hakkındaki kutsal gerçeği söyle" anlamına gelmez, daha ziyade "C kodluyorum, bunu yapamıyorum, lütfen bana bunun mümkün olup olmadığını ve nasıl olduğunu söyleyin? "
Gregory Pakosz

8
Bunu yapmanın standart bir yolu olmadığına katılıyorum, ancak OP'nin bahsetmesi, mkstempbu özel durumda standart olmayan çözümlerin kabul edilebilir olduğunu ima ediyor. Ancak bu durumda, posixetiketi eklemiş olmalıydı (o zamandan beri eklendiğini görüyorum).
Emerick Rogul

9
@Neil ve Net'in amacı ve hayatın anlamı. Farklı görüşlere sahip olduğunuzu söyleseydiniz daha mantıklı olursunuz. Ayrıca, SO'nun tamamen standartların üzerinde saç ayrılmasıyla ilgili olduğundan şüpheliyim. Ve 23'ün itibarına karşılık gelen SO-deneyimi olan birinin etiketleme becerilerine güvenmek pek pratik değil.
Michael Krelin - hacker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.