2012-09-11 13 views
14

सी ++ में फ़ाइल आईओ करने के लिए हम ऑफस्ट्रीम, ifstream और fstream कक्षाओं का उपयोग करते हैं।सी ++ फ़ाइल स्ट्रीम ओपन मोड अस्पष्टता

  • ofstream: स्ट्रीम वर्ग फ़ाइलों
  • ifstream पर लिखने के लिए: स्ट्रीम वर्ग फ़ाइलों
  • fstream से पढ़ने के लिए: स्ट्रीम वर्ग दोनों पढ़ सकते हैं और से/फ़ाइलों को लिखने के लिए

स्ट्रीम ऑब्जेक्ट वाली फ़ाइल को जोड़ने की प्रक्रिया को "फ़ाइल खोलना" कहा जाता है। फ़ाइल खोलते समय हम उस मोड को निर्दिष्ट कर सकते हैं जिसमें फ़ाइल खोला जाना है। मेरी क्वेरी ios::out और ios:in मोड से संबंधित है।

जब मैं एक ofstream वस्तु बना सकते हैं और ios::in मोड के साथ फ़ाइल को खोलने, मैं सक्षम लिखने के लिए फ़ाइल में हूँ, लेकिन केवल तभी जब अपने पहले से बनाए (ios::out मोड फ़ाइल के साथ भी अगर यह पहले से ही मौजूद नहीं होती हैं)।
लेकिन जब मैं ifstream ऑब्जेक्ट बनाता हूं और ios::out मोड के साथ फ़ाइल खोलता हूं, तो मैं फ़ाइल से पढ़ने में सक्षम हूं।

मेरा प्रश्न क्यों इन मोड (ios::in/ios::out) भाषा के आधार पर आपूर्ति की जाती है जब धारा (ifstream/ofstream) के प्रकार के ही निर्दिष्ट करता आपरेशन (इनपुट/आउटपुट) की जो प्रकार के रूप में प्रदर्शन किया जा रहा है?

भी क्यों इस अस्पष्ट उपयोग (ios::in साथ ofstream और ifstreamios::out के साथ) एक मामले में काम करता है और दूसरे में विफल रहता है (हालांकि केवल यदि फ़ाइल पहले से ही मौजूद नहीं है)?

उत्तर

11

ofstream, ifstream और fstream कक्षाएं छोटा सा अफसर filebuf है, जो एक धारा के rdbuf() सदस्य समारोह के माध्यम से प्राप्त कर सकते हैं के लिए उच्च स्तरीय इंटरफेस है।

मानक के अनुसार जब आप ofstream को कुछ मोड mode के साथ खोलते हैं, तो यह mode | ios_base::out के साथ अंडरलाइनिंग स्ट्रीम बफर खोलता है। आकस्मिक रूप से ifstreammode | ios_base::in का उपयोग करता है। fstream अंडरलाइनिंग स्ट्रीम बफर को mode पैरामीटर वर्बैटिम पास करता है।

क्या इसके बाद के संस्करण का तात्पर्य है कि निम्नलिखित कोड ठीक उसी खुला झंडे के साथ फ़ाइल को खोलता है:

fstream f("a.txt", ios_base::in | ios_base::out); 
ifstream g("a.txt", ios_base::out); 
ofstream h("a.txt", ios_base::in); 

इन पंक्तियों आप कर सकते हैं के बाद वास्तव में f.rdbuf(), g.rdbuf() और h.rdbuf(), और सभी के साथ एक ही बातें तीन कार्य जैसे कि आपने सी कॉल fopen("a.txt", "r+") के साथ फ़ाइल खोला है, जो आपको पढ़ने/लिखने का उपयोग देता है, फ़ाइल को छोटा नहीं करता है, और फ़ाइल मौजूद नहीं होने पर विफल रहता है।

तो, हमारे पास तीन अलग-अलग कक्षाएं क्यों हैं? जैसा कि मैंने पहले ही कहा है, ये निम्न स्तर के वर्ग हैं जो निचले स्तर के स्ट्रीम बफर पर उच्च स्तरीय इंटरफ़ेस प्रदान करते हैं। विचार यह है कि ifstream में इनपुट के लिए सदस्य फ़ंक्शन हैं (जैसे read()), ofstream में आउटपुट के लिए सदस्य फ़ंक्शन हैं (जैसे write()) जबकि fstream दोनों में हैं। उदाहरण के लिए यदि आप ऐसा नहीं कर सकते हैं:

g.write("abc", 3); // error: g does not have a write function 

लेकिन यह, काम करता है, क्योंकि यद्यपि g एक ifstream है, हम इसे ios_base::out साथ खोला था:

g.rdbuf()->sputn("abc", 3); // we still have write access 
0

क्योंकि मोड इनपुट/आउटपुट तक सीमित नहीं है। ifstream के निर्माता, उदाहरण के लिए, लगता है:

explicit ifstream (const char * filename, ios_base::openmode mode = ios_base::in); 

नोट डिफ़ॉल्ट मान ios_base::in है, तो आप यह अपने आप को निर्दिष्ट करने की जरूरत नहीं है। हालांकि, mode सेट धाराओं झंडे जो in/out तक ही सीमित नहीं हैं, लेकिन में शामिल हैं:

  • app (संलग्न) प्रत्येक उत्पादन ऑपरेशन से पहले धारा के अंत तक धारा की स्थिति सूचक सेट करें।
  • ate (अंत में) स्ट्रीम के स्थिति सूचक को खोलने पर स्ट्रीम के अंत में सेट करें।
  • binary (बाइनरी) पाठ के बजाय बाइनरी के रूप में स्ट्रीम पर विचार करें।
  • in (इनपुट) स्ट्रीम पर इनपुट संचालन की अनुमति दें।
  • out (आउटपुट) स्ट्रीम पर आउटपुट ऑपरेशन की अनुमति दें।
  • trunc (छंटनी) किसी भी मौजूदा सामग्री को खारिज करने पर शून्य की लंबाई मानते हुए, किसी भी मौजूदा सामग्री को त्याग दिया जाता है।
संबंधित मुद्दे