2016-02-29 8 views
9

मुझे इस स्पष्ट रूप से मामूली कार्य करने के लिए एक सी ++ दिनचर्या विकसित करने की आवश्यकता है: फ़ाइल केवल तभी बनाएं जब यह अस्तित्व में न हो, अन्यथा कुछ भी नहीं करें/त्रुटि उत्पन्न करें।रेस की स्थिति से बचने वाली एक नई फाइल बनाना

जैसा कि मुझे दौड़ की स्थिति से बचने की ज़रूरत है, मैं "क्षमा मांगने की अनुमति नहीं मांगना" सिद्धांत का उपयोग करना चाहता हूं (यानी इच्छित ऑपरेशन का प्रयास करना और जांचना कि यह सफल हो गया है, क्योंकि अग्रिम में पूर्व शर्त जांचने के विपरीत), जो मेरे ज्ञान के लिए , इस उद्देश्य के लिए एकमात्र मजबूत और पोर्टेबल विधि है [Wikipedia article][an example with getline]

फिर भी, मुझे अपने मामले में इसे लागू करने का कोई तरीका नहीं मिला। सबसे अच्छा मैं app मोड (या fopen आईएनजी "a" के साथ) में fstream खोल रहा है) tellp (सी ++) या ftell (सी) के साथ आउटपुट स्थिति की जांच कर रहा है और ऐसी स्थिति शून्य नहीं होने पर निरस्त कर रहा है। हालांकि इसमें दो नुकसान हैं, अर्थात् यदि फ़ाइल मौजूद है तो यह लॉक हो जाती है (हालांकि थोड़े समय के लिए) और इसकी संशोधन तिथि बदल दी गई है।

मैं fstream के लिए ios_base::openmode के अन्य संभावित संयोजनों, साथ ही fopen की mode तार जाँच की लेकिन कोई विकल्प नहीं है कि मेरी जरूरतों के अनुकूल पाया। सी और सी ++ मानक पुस्तकालयों के साथ-साथ बूस्ट फाइल सिस्टम में आगे की खोज, निष्फल साबित हुई।

क्या कोई ओएस-विशिष्ट कार्यों पर भरोसा किए बिना मेरे काम को मजबूत तरीके से करने के लिए कोई तरीका बता सकता है (कोई संपार्श्विक प्रभाव नहीं, कोई दौड़ की स्थिति नहीं)? मेरी विशिष्ट समस्या विंडोज़ में है, लेकिन पोर्टेबल समाधानों को प्राथमिकता दी जाएगी।

EDIT: बिटविस्टलर द्वारा उत्तर सी प्रोग्राम के लिए पूरी तरह से समस्या हल करता है। फिर भी, मुझे आश्चर्य है कि कोई सी ++ बेवकूफ समाधान मौजूद नहीं है। openO_EXCL के साथ एंड्रयू हेनले द्वारा प्रस्तावित O_EXCL विशेषता के साथ उपयोग करता है, जो कि ओएस-विशिष्ट है (विंडोज़ में विशेषता को अतिरिक्त अंडरस्कोर [MSDN] के साथ _O_EXCL कहा जाता है) या एक अलग से एक सी 11 फ़ाइल संकलित करता है और इसे C++ कोड से लिंक करता है । इसके अलावा, प्राप्त किए गए फ़ाइल डिस्क्रिप्टर को गैर-मानक एक्सटेंशन (उदा। जीसीसी के __gnu_cxx::stdio_filebuf) को छोड़कर स्ट्रीम में परिवर्तित नहीं किया जा सकता है। मुझे उम्मीद है कि सी ++ का भविष्य संस्करण "x" सबट्रिब्यूट और संभवतः फ़ाइल धाराओं के लिए ios:: संशोधक को लागू करेगा।

+0

आप कई धागे या कई प्रक्रियाओं के बीच दौड़ की स्थिति से बचने के लिए करना चाहते हैं? – user2807083

+3

आपका ओएस क्या है? POSIX जो आप करना चाहते हैं उसे करने के लिए ['खुला (फ़ाइल नाम, O_CREAT | O_EXCL ...)'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html) प्रदान करता है। –

+1

Win32 API इसे अनुमति देता है। मैं निश्चित रूप से यह जानता हूँ। –

उत्तर

3

नया सी मानक (सी2011, जो सी ++ का हिस्सा नहीं है) एक नया मानक सबस्पेसिफर ("एक्स") जोड़ता है, जिसे किसी भी "डब्ल्यू" विनिर्देशक ("wx", "wbx" बनाने के लिए जोड़ा जा सकता है, "डब्ल्यू + एक्स" या "डब्ल्यू + बीएक्स"/"डब्ल्यूबी + एक्स")। यह subspecifier फ़ंक्शन को विफल करने के बजाय, फ़ाइल मौजूद होने पर विफल होने के लिए मजबूर करता है।

स्रोत: http://www.cplusplus.com/reference/cstdio/fopen/

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