C ++ streamoffएक (फ़ाइल) स्ट्रीम के भीतर एक ऑफसेट का प्रतिनिधित्व करने के लिए प्रकार का उपयोग करता है और इसे इस तरह परिभाषित किया जाता है: [stream.types]:
using streamoff = implementation-defined ;टाइप स्ट्रीमऑफ़ ऑपरेटिंग सिस्टम के लिए अधिकतम संभव फ़ाइल आकार का प्रतिनिधित्व करने के लिए पर्याप्त आकार के हस्ताक्षरित मूल अभिन्न प्रकारों में से एक का एक पर्याय है। 287)
287) आमतौर पर लंबे समय तक।
यह समझ में आता है क्योंकि यह बड़ी फ़ाइलों के भीतर (जैसा कि उपयोग करने के लिए विरोध longकिया जा सकता है, जो केवल 32 बिट्स चौड़ा हो सकता है) के लिए अनुमति देता है।
[filebuf.virtuals] basic_filebufफ़ाइल के भीतर खोज करने के लिए फ़ंक्शन को निम्नानुसार परिभाषित करता है:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_typeके बराबर है streamoff, देखें [iostreams.limits.pos]। हालांकि, मानक तब फ़ंक्शन के प्रभावों की व्याख्या करता है। मुझे बहुत अंतिम वाक्य से चिढ़ है, जिसके लिए कॉल की आवश्यकता है fseek:
प्रभाव :
widthनिरूपित करते हैंa_codecvt.encoding()। यदिis_open() == false, याoff != 0 && width <= 0, तो स्थिति संचालन विफल हो जाता है। अन्यथा, यदिway != basic_ios::curयाoff != 0, और यदि अंतिम ऑपरेशन आउटपुट था, तो आउटपुट अनुक्रम को अपडेट करें और कोई भी अनशिफ्ट अनुक्रम लिखें। अगला, नई स्थिति की तलाश करें: यदिwidth > 0, कॉल करेंfseek(file, width * off, whence), अन्यथा कॉल करेंfseek(file, 0, whence)।
fseekएक longपैरामीटर स्वीकार करता है । यदि off_typeऔर (मानक के अनुसार सुझाव दिया गया है) के streamoffरूप में परिभाषित long longकिया गया है, तो यह longकॉल करते समय रूपांतरण को कम कर सकता है fseek(file, width * off, whence)(कीड़े का निदान करने के लिए संभावित रूप से कठिन हो सकता है)। यह streamoffपहली जगह में प्रकार को शुरू करने के लिए पूरे तर्क को प्रश्न में रखता है।
क्या यह जानबूझकर या मानक में एक दोष है?
seekoffजरूरी उपयोग की तरह नहीं दिखता है fseek। बल्कि, (संभवतः परिचित?) व्यवहार का fseekउपयोग यह बताने के लिए किया जाता है कि क्या seekoffकर रहा है।
fseekजब तक यह समान प्रभाव के साथ कुछ करता है। लेकिन fseekकम LONG_MINया अधिक से अधिक ऑफसेट के साथ LONG_MAXकोई प्रभाव नहीं होता है, इसलिए स्पष्टीकरण सबसे अधूरा है, कम से कम कार्यान्वयन के लिए जहां streamoffकी तुलना में व्यापक है long।