2012-07-19 13 views
11

संभव डुप्लिकेट:
Getting a FILE* from a std::fstreamप्राप्त कर रहा है फ़ाइल वर्णनकर्ता :: fstream

मैं लिनक्स और फ़ाइल वर्णनकर्ता पर काम कर रहा हूँ इस ओएस में मुख्य मॉडल हैं।

मैं सोच रहा था कि कोई लाइब्रेरी है या कोई सी ++ std::fstream से शुरू होने वाली मूल लिनक्स फ़ाइल डिस्क्रिप्टर को पुनर्प्राप्त करने का कोई तरीका है या नहीं।

मैंने boost::iostream के बारे में सोचा क्योंकि file_descriptor नामक एक कक्षा है, लेकिन मुझे समझ में आया कि इसका उद्देश्य एक से अलग है जिसे मैं हासिल करना चाहता हूं।

क्या आपको ऐसा करने का कोई तरीका पता है?

+1

आप फ़ाइल वर्णनकर्ता आवश्यकता क्यों है? –

+0

मैं भी गैर-मानक की तलाश में हूं क्योंकि मैं लिनक्स प्लेटफॉर्म पर रहूंगा। मुझे यह पृष्ठ भी मिला। किसी ने इसका इस्तेमाल किया? Anyhttp: //www.ginac.de/~kreckel/fileno/ –

+6

यह प्रश्न डुप्लिकेट नहीं है। यह प्रश्न पूछता है कि iostream से फ़ाइल डिस्क्रिप्टर कैसे प्राप्त करें। एक फ़ाइल डिस्क्रिप्टर एक निम्न स्तरीय कर्नेल अवधारणा है। इस सवाल को मूल के रूप में इंगित किया गया है, जिसमें यह माना जाता है कि यह FILE * धाराओं की एक डुप्लिकेट बोलता है, जो समान नहीं हैं। – Daniel

उत्तर

5

आप दूसरी तरफ जा सकते हैं: अपने स्वयं के स्ट्रीम बफर को कार्यान्वित करें जो फ़ाइल डिस्क्रिप्टर को लपेटता है और फिर fstream के बजाय iostream के साथ इसका उपयोग करें। Boost.Iostreams का उपयोग करना कार्य को आसान बना सकता है।

गैर पोर्टेबल जीसीसी समाधान है:

#include <ext/stdio_filebuf.h> 

{ 
    int fd = ...; 
    __gnu_cxx::stdio_filebuf<char> fd_file_buf{fd, std::ios_base::out | std::ios_base::binary}; 
    std::ostream fd_stream{&fd_file_buf}; 
    // Write into fd_stream. 
    // ... 
    // Flushes the stream and closes fd at scope exit. 
} 
2

फ़ाइल डिस्क्रिप्टर को न तो मानक सी ++ में और न ही libstdc++ में प्रदर्शित करने का कोई समर्थन नहीं है।

3

एक std :: fstream से फ़ाइल संख्या निकालने का कोई (मानक) तरीका नहीं है क्योंकि मानक लाइब्रेरी यह नहीं बताती है कि फ़ाइल स्ट्रीम कैसे कार्यान्वित की जाएंगी।

इसके बजाय, यदि आप ऐसा करना चाहते हैं तो आपको सी फ़ाइल एपीआई का उपयोग करने की आवश्यकता है (FILE* का उपयोग करके)।

3

फ़ाइल स्ट्रीम के निजी फ़ाइल हैंडल (या वास्तविक रूप से std::basic_filebuf) प्राप्त करने का कोई आधिकारिक तरीका नहीं है, क्योंकि यह पोर्टेबल और प्लेटफॉर्म-विशिष्ट कार्यों के उपयोग को हतोत्साहित करना चाहिए।

हालांकि, आप std::basic_filebuf विरासत की तरह बदसूरत हैक कर सकते हैं और उस से फ़ाइल हैंडल को बाहर निकालने का प्रयास करें। यह कुछ ऐसा नहीं है जिसे मैं अनुशंसा करता हूं हालांकि यह संभवतः सी ++ लाइब्रेरी के विभिन्न संस्करणों को तोड़ देगा।

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