2011-12-07 6 views
5
int source = open("hi", O_CREAT | O_RDONLY); 
int dest = open("resultfile", O_CREAT | O_RDWR | O_TRUNC); 

FILE* source1 = fdopen(source, "r"); 
FILE* dest1 = fdopen(dest, "w+"); 

// outside of a testcase I would write something into 'resultfile' here 

close(source); 
close(dest); 
fclose(source1); 
fclose(dest1); 

int sourcef = open("resultfile", O_RDONLY); 
printf(strerror(errno)); // <--- Bad file descriptor 

मैं क्यों समझ में नहीं आता? मैं खुले() के साथ स्ट्रीम आधारित आईओ को सफलतापूर्वक कैसे मिला सकता हूं?मिश्रण fdopen() और खुले() -> बुरा फ़ाइल वर्णनकर्ता

एक लाइब्रेरी जो मैं काम कर रहा हूं केवल एक पूर्णांक एफडी स्वीकार करता है (और लाइब्रेरी इसे बंद करने के लिए आंतरिक रूप से जिम्मेदार है, संभवतया निकट() के साथ), लेकिन मुझे अभी भी फ़ाइल के साथ काम करने की आवश्यकता है, और मैं नहीं करता देखें कि एफ() कॉल (fread(), ftell() आदि के बिना ठीक से कैसे संभव है

उत्तर

13

fclose आपके लिए close पर कॉल करता है। यदि आप fclose, dup को पहले एफडी कॉल करने के बाद एफडी को चारों ओर रखना चाहते हैं।

int fd = open(...); 
int fd2 = dup(fd); 
FILE *fp = fdopen(fd2); 
fclose(fp); 
// fd is still valid. 

बुरा अपने उदाहरण में फ़ाइल वर्णनकर्ता त्रुटि संदेश fclose(dest1) कॉल से सुस्त है।

+0

धन्यवाद! मैंने मैनपेज को सावधानीपूर्वक पर्याप्त नहीं पढ़ा क्योंकि fdopen() manpage को फ्रीपेन() और fopen() के साथ मिश्रित किया गया है: / – Blub

संबंधित मुद्दे