This answer इस तथ्य को इंगित करता है कि सी ++ बाइनरी फ़ाइल पर पुनरावृत्ति के लिए उपयुक्त नहीं है, लेकिन मुझे अभी यह चाहिए कि मुझे "बाइनरी" तरीके से फ़ाइलों पर काम करने की ज़रूरत है, हां सभी फाइलें बाइनरी हैं यहां तक कि .txt वाले, लेकिन मैं कुछ ऐसी चीजें लिख रहा हूं जो छवि फ़ाइलों पर चलती हैं, इसलिए मुझे अच्छी तरह से संरचित फाइलें पढ़ने की ज़रूरत है, क्या डेटा को एक विशिष्ट तरीके से व्यवस्थित किया गया था।सी ++ बाइनरी फाइलें और इटरेटर: ifstreambuf_iterator का उपयोग कर 1: 1 से दूर हो रहे हैं?
मैं पूरी फ़ाइल को डेटा संरचना में std::vector<T>
में पढ़ना चाहूंगा ताकि मैं लगभग फ़ाइल को बंद कर सकूं और डिस्क I/O की देखभाल किए बिना स्मृति में सामग्री के साथ काम कर सकूं।
अभी, मानक पुस्तकालय के अनुसार एक फ़ाइल पर एक पूरी यात्रा प्रदर्शन करने के लिए सबसे अच्छा तरीका है
std::ifstream ifs(filename, std::ios::binary);
for (std::istreambuf_iterator<char, std::char_traits<char> > it(ifs.rdbuf());
it != std::istreambuf_iterator<char, std::char_traits<char> >(); it++) {
// do something with *it;
}
ifs.close();
या std::copy
का उपयोग की तर्ज पर कुछ है, लेकिन फिर भी std::copy
साथ आप हमेशा istreambuf
iterators का उपयोग कर रहे (इसलिए यदि मैं सी ++ दस्तावेज को सही ढंग से समझता हूं, तो आप मूल कोड को पिछले कोड के साथ प्रत्येक कॉल पर 1 बाइट पढ़ रहे हैं)।
तो सवाल यह है कि: मैं एक कस्टम इटरेटर कैसे लिखूं? जहां से मुझे उत्तराधिकारी होना चाहिए?
मुझे लगता है कि डिस्क पर फ़ाइल लिखते समय यह भी महत्वपूर्ण है, और मुझे लगता है कि मैं लिखने के लिए एक ही इटरेटर वर्ग का उपयोग कर सकता हूं, अगर मैं गलत हूं तो कृपया मुझे सही करने के लिए स्वतंत्र महसूस करें।
क्या इनबाउंड डेटा का * आकार * आपको केवल ['ifs.read'] (http://en.cppreference.com/w/cpp/io/basic_istream/read) से अलग करता है-डेटा को सीधे ऊपर ले जाना एक 'std :: वेक्टर 'में और उस पर फिर से चल रहा है? –
WhozCraig
@WhozCraig अब मुझे नहीं लगता कि फ़ाइल मेमोरी में रखने के लिए बहुत बड़ी है (यदि आप यही कह रहे हैं), मैं 'रीड' या किसी अन्य तरीके से ठीक हूं, यहां तक कि कन्स्ट्रक्टर 'वेक्टर' वर्ग इटरेटर्स का समर्थन करता है, इसलिए मैं उस तरफ ठीक हूं, "समस्या" स्वयं ही इटरेटर हैं, मैं डेटा को अलग-अलग ब्राउज़ करने का प्रयास करने के लिए एक लिखना चाहता हूं। संपादित करें: मैं किसी भी सी-आईश तरीके से बचना चाहता हूं, मैं इटरेटर के साथ रहूंगा। – user2485710
* आप मूल रूप से प्रत्येक कॉल पर 1 बाइट पढ़ रहे हैं * - 'ifstream' के इन-मेमोरी बफर से, फ़ाइल से नहीं। वास्तविक पढ़ने (2) कॉल अभी भी प्रत्येक 4k या 16k के लिए हैं या जो भी आपके लिए डिफ़ॉल्ट बफर है। – Cubbi