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
।