फ़ाइल डिस्क्रिप्टर से FILE पॉइंटर कैसे प्राप्त करें?


85

मैं साथ खेल रहा हूं mkstemp(), जो एक फाइल डिस्क्रिप्टर प्रदान करता है, लेकिन मैं इसके माध्यम से स्वरूपित आउटपुट उत्पन्न करना चाहता हूं fprintf()। क्या mkstemp()एक FILE *संरचना द्वारा प्रदान की गई फ़ाइल डिस्क्रिप्टर को बदलने का एक आसान तरीका है जो उपयोग के लिए उपयुक्त है fprintf()?


जवाबों:


101

उपयोग करें fdopen():

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

34
और फाइल डिस्क्रिप्टर को FILE से प्राप्त करने के लिए उपयोग करें fileno(): linux.die.net/man/3/fileno
ली

2
अगर fdकुछ झंडे के साथ खोला गया था (जैसे O_NONBLOCK) - fdopenनए झंडे के साथ इसे खोलने के बाद उनके साथ क्या होगा ? क्या उन्हें xorएक साथ रखा जाएगा या प्रतिस्थापित किया जाएगा?
xealits

5
@jww: फाइल डिस्क्रिप्टर शुरू करने के लिए एएनएसआई सी नहीं हैं।
रफ़लविंड

2
क्या किसी भी तरह से fdopenकई बार कॉल करना बुरा है ? (यह मानते हुए कि यह किसी कार्य के अंदर होता है जिसे बार-बार कहा जाता है)
phil294

2
@xealits फ़ाइल * के विकल्प पहले से खुली हुई फ़ाइल डिस्क्रिप्टर के दायरे में होना चाहिए। तो अगर आपने केवल पढ़ने के साथ fd खोला है, और FILE * केवल लिखने के साथ है, तो इसे एक अपवाद फेंक देना चाहिए। अधिक जानकारी के लिए का उल्लेख ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/...
Tjad क्लार्क

28

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

आदमी fdopen उत्पादन:

SYNOPSIS

#include <stdio.h>

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

fdopen()समारोह, मौजूदा फ़ाइल वर्णनकर्ता के साथ एक धारा एकत्रित करती है fildes। स्ट्रीम का मोड फ़ाइल डिस्क्रिप्टर के मोड के साथ संगत होना चाहिए। जब धारा के माध्यम से बंद किया जाता है fclose(3), तब fildesभी बंद होता है।


1
एएनएसआई सी में उपलब्ध नहीं है
jww

अधिक स्पष्टता के लिए, का उल्लेख ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/...
Tjad क्लार्क

-8

ऐसा करने का कोई मानक तरीका (या रिवर्स) नहीं है क्योंकि सी स्टैंडर्ड में फाइल डिस्क्रिप्टर के बारे में कुछ भी नहीं है। आपका विशिष्ट प्लेटफ़ॉर्म ऐसा तंत्र प्रदान कर भी सकता है और नहीं भी।


17
आप "मानक" से क्या मतलब है पर निर्भर करता है। POSIX एक मानक है।
रिचर्ड पेनिंगटन

12
प्रश्न फ़ाइल विवरणकों के बारे में था। ;-)
रिचर्ड पेनिंगटन

11
@Neil> C के रूप में टैग किए जा रहे प्रश्न का यह अर्थ नहीं है कि "मुझे C मानक के बारे में होली सत्य बताएं" बल्कि "मैं C में कोडिंग कर रहा हूं, मैं ऐसा करने में विफल हूं, कृपया मुझे बताएं कि क्या यह संभव है और कैसे? "
ग्रेगरी पॉक्सोज

8
मैं मानता हूं कि ऐसा करने का कोई मानक तरीका नहीं है, लेकिन ओपी का उल्लेख mkstempहै कि इस विशेष उदाहरण में गैर-मानक समाधान स्वीकार्य हैं। उस मामले में, हालांकि, उसे posixटैग को जोड़ना चाहिए था (जो मुझे लगता है कि जोड़ा गया है)।
एमरिक रोगुल

9
@ नील, और नेट का उद्देश्य और जीवन का अर्थ। यदि आप कह चुके हैं कि आप अलग-अलग राय वाले हैं, तो आप अधिक समझ पाएंगे। मुझे यह भी संदेह है कि SO सभी मानकों पर बाल कटवाने के बारे में है। और 23 की प्रतिष्ठा के अनुरूप एसओ-अनुभव वाले किसी व्यक्ति के कौशल को टैग करने पर भरोसा करना बहुत व्यावहारिक नहीं है।
माइकल क्रेलिन - हैकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.