2009-05-08 15 views
9

पर पहुंच (पढ़ने और लिखने) से इनकार करने का तरीका कैसे है I fstream के साथ खोलने वाली फ़ाइल तक पहुंच से इनकार कैसे कर सकता हूं? जब मैं fstream के साथ इसे पढ़ रहा/लिख रहा हूं, तो मैं फ़ाइल तक पहुंच में असमर्थ होना चाहता हूं?std का उपयोग करना: fstream फ़ाइल को

+0

इनकार दोनों पढ़ने और लिखने होगा पहुँच नहीं लिख सकते हैं मुझे फ़ाइल से पढ़ने और सामग्री के अनुसार लाइनों को बदलने की जरूरत है। मैं फ़ाइल में बदलावों से बचना चाहता हूं, जबकि मैं इसे पढ़ रहा हूं और लिख रहा हूं (नवीनतम डेटा है और ओवरराइड नहीं है) मैंने इसे fstream का उपयोग करके प्रत्यारोपित किया है, क्या मुझे हैंडल और बफर (रीडफाइल) का उपयोग करने के लिए पूरे कोड को बदलने की ज़रूरत है। या मैं fstream से एक हैंडल प्राप्त कर सकते हैं? मुझे readfile और writefile में परेशानी थी क्योंकि मुझे लाइन से लाइन पढ़ने और लिखने की आवश्यकता है। (Fstream साथ मैं getline फ़ंक्शन का उपयोग किया fstream FS (पथ) जबकि (file.eof()) \t getline (एफएस, लाइन);।! कुछ करना ... fs.write (str, str.size ()); fs.clear(); fs.close(); – sofr

+0

क्या आप अपनी फ़ाइल को अपने प्रोग्राम के किसी अन्य उदाहरण से या किसी अन्य प्रोग्राम से सुरक्षित रखना चाहते हैं? सबसे पहले, लॉक फ़ाइलों का उपयोग करना एक आसान समाधान है/निर्देशिकाएं - अधिकांश कार्यक्रम इसे इस तरह से करते हैं। दूसरे के लिए, मैंने इसे कभी नहीं देखा है - अगर आपको वास्तव में इसकी आवश्यकता है, तो मेरा उत्तर देखें। – Hali

उत्तर

13

आप इसे मानक fstream के साथ नहीं कर सकते हैं, आपको प्लेटफॉर्म विशिष्ट कार्यों का उपयोग करना होगा।

विंडोज पर, आप CreateFile() या LockFileEx() का उपयोग कर सकते हैं। लिनक्स पर, flock(), lockf(), और fcntl() (जैसा कि पिछले टिप्पणीकर्ता ने कहा था)।

यदि आप एमएसवीसी का उपयोग कर रहे हैं, तो आप fstream के कन्स्ट्रक्टर को तीसरा पैरामीटर पास कर सकते हैं। Visual Studio 6 या newer versions के लिए प्रलेखन देखें। बेशक यह अन्य कंपाइलरों और प्लेटफार्मों के साथ काम नहीं करेगा।

आप दूसरों को किसी भी तरह से क्यों लॉक करना चाहते हैं? एक बेहतर समाधान हो सकता है ...

+1

[यह थ्रेड] (http: // stackoverflow।कॉम/प्रश्न/44350 9 1/sh-none-is-not-a-member-of-stdbasic-filebuf-elem-traits/4435481 # 4435481) 'fstream' का उपयोग करने के बारे में अधिक जानकारी प्रदान करता है) – Casebash

3

देशी सी ++ में ऐसा करने का कोई तरीका नहीं है, क्योंकि यह अत्यधिक प्लेटफार्म निर्भर होगा। लिनक्स/यूनिक्स पर, आप इसे flock या fcntl के साथ कर सकते हैं। मुझे सच में यकीन नहीं है कि विंडोज़ पर इसे कैसे किया जाए।

विंडोज़ पर, ऐसा लगता है कि आपको कुछ झंडे CreatFile पर पास करना होगा या LockFileEx (जो बाइट रेंज लॉकिंग की अनुमति देता है) का उपयोग करें।

ध्यान दें कि, ये सभी विधियां अंतर्निहित ओएस फ़ाइल डिस्क्रिप्टर/हैंडल पर काम करती हैं, fstream एस के साथ नहीं। आपको या तो फ़ाइल से पढ़ने/लिखने के लिए पॉज़िक्स या विंडोज एपीआई का उपयोग करने की आवश्यकता होगी, या फ़ाइल डिस्क्रिप्टर/हैंडल को fstream में लपेटें। यह मंच फिर से निर्भर है। मुझे यकीन है कि ऐसा करने का एक तरीका है, लेकिन मुझे इसे अपने सिर के ऊपर से याद नहीं है।

2

Boos Interprocess मॉड्यूल का उपयोग करके, file lock कार्यक्षमता है।

फ़ाइल को लॉक करें, इसे खोलें, पढ़ें और/या उससे लिखें, इसे बंद करें, इसे अनलॉक करें।

4

Casebash द्वारा टिप्पणी पर विस्तार:

खिड़कियों में एक फ़ाइल खोलने के लिए इतना है कि अन्य प्रक्रियाओं यह

file.rdbuf()->open(path, std::ios_base::app, _SH_DENYWR); 

_SH_DENYRW उपयोग करने के लिए

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