2010-10-21 21 views
24

fopen फ़ंक्शन एक पॉइंटर को FILE संरचना पर लौटाता है, जिसे इसकी सामग्री या अर्थ से निपटने के बिना अपारदर्शी मान माना जाना चाहिए।मैं फॉपेन फ़ाइल संरचना से फ़ाइल हैंडल कैसे प्राप्त करूं?

विंडोज़ पर, सी रनटाइम विंडोज एपीआई का एक रैपर है, और fopen फ़ंक्शन CreateFile फ़ंक्शन पर निर्भर करता है। CreateFile फ़ंक्शन HANDLE देता है, जिसका उपयोग अन्य विंडोज एपीआई द्वारा किया जाता है।

अब, मुझे पुस्तकालय के अंदर गहरी विंडोज एपीआई का उपयोग करने की आवश्यकता है जो fopen और FILE* का उपयोग करता है। तो: संरचना से HANDLE प्राप्त करने का कोई तरीका है? चूंकि यह संकलक विशिष्ट है, मेरा मतलब एमएसवीसी रनटाइम लाइब्रेरी पर है।

मैं समझता हूं कि यह एक बदसूरत, गैर-पोर्टेबल हैक होगा, और अगर माइक्रोसॉफ्ट FILE के आंतरिक प्रारूप को बदलता है तो मैं तोड़ सकता हूं ... लेकिन मैं एक बंद सिस्टम पर विकसित कर रहा हूं (यानी विंडोज सीई एम्बेडेड सिस्टम पर) और लाइब्रेरी को दोबारा काम करना मुश्किल और समय लेने वाला होगा।

+1

महान प्रश्न का प्रयास करें, मैं इस एक साल अपने आप को 2 साल पहले के साथ निपटा। –

उत्तर

15

_fileno_get_osfhandle का उपयोग करें। जब आप पूरा कर लें तो _close को न भूलें।

संपादित करें: यह मुझे स्पष्ट नहीं है कि _get_osfhandle WinCE पर समर्थित है। हालांकि WinCE _fileno के दस्तावेज़ों का कहना है कि यह "वर्णनकर्ता" के बजाय "फ़ाइल हैंडल" देता है। वाईएमएमवी लेकिन इससे पता चलता है कि आप WinCE पर एक हैंडल के रूप में सीधे _fileno रिटर्न वैल्यू का उपयोग कर सकते हैं।

संपादित करें: # 2 उस सिद्धांत को this person's experience द्वारा समर्थित किया गया है।

"आप हेडर फाइल है कि मैं 29 जनवरी पर सूची में तैनात पर एक नज़र डालें तो आप देख सकते हैं कि मैं फ़ाइल निर्माण/संभाल समस्या संभाला है। मैं नहीं था सब फ़ाइल को बदलने के * आइटम के साथ । संभालती fileio.cpp से निम्नलिखित स्निपेट देखें:

#ifndef q4_WCE 

    FlushFileBuffers((HANDLE) _get_osfhandle(_fileno(_file))); 
    HANDLE h = ::CreateFileMapping((HANDLE) 
_get_osfhandle(_fileno(_file)), 
         0, PAGE_READONLY, 0, len, 0); 
#else 

    FlushFileBuffers((HANDLE) _fileno(_file)); 
    HANDLE h = ::CreateFileMapping((HANDLE) _fileno(_file), 
        0, PAGE_READONLY, 0, len, 0); 
#endif //q4_WCE 

ऐसा लगता है कि _fileno रिटर्न एक हैंडल तुम बस यह कास्ट करने के लिए नहीं है। "।

+1

धन्यवाद, _fileno मेरे विंडोज सीई मुद्दे के लिए काफी अच्छा था, लेकिन आपका उत्तर एमएसवीसी के किसी भी संस्करण के साथ सभी एमएस प्लेटफार्मों पर वास्तव में "पोर्टेबल" लगता है। – Wizard79

4

लिनक्स पर, वहाँ int fileno(FILE *); समारोह है कि फ़ाइल वर्णनकर्ता (एक है कि निम्न स्तर के open समारोह से वापस आ गया था) FILE* से वापस है।

मुझे नहीं पता कि यह विंडोज पर लागू होता है और हैंडल लौटाता है?

+1

हम्म, यह संभव है: http://msdn.microsoft.com/en-us/library/ee479262.aspx कहता है कि "_fileno स्ट्रीम से जुड़े फ़ाइल हैंडल प्राप्त करता है"। कम से कम विंडोज सीई पर यह काम करना चाहिए। – Wizard79

+1

यह * निक्स के लिए सिर्फ एक compat फ़ंक्शन है। हैंडल Win64 पर 8 बाइट्स सूचक हैं। –

2

सी के लिए, यह

HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w"))); 
+0

बाद में प्रयुक्त, यह मुझे बता रहा है कि हैंडल अमान्य है उदा। stdout। – imallett