2012-10-08 27 views
7

स्थिति/ऑफसेट/धाराओं के आकार को मापने के लिए, मानक std::streampos, std::streamoff और std::streamsize निर्दिष्ट करें, लेकिन वे कार्यान्वयन परिभाषित किए गए हैं।std :: streampos, std :: streamoff और std :: लंबे समय तक intsize?

इन प्रकारों को एक सुरक्षित और पोर्टेबल तरीके से long long int में कैसे परिवर्तित करें? (उदाहरण के लिए फ़ाइल आकार को मापने और इसे उस फ़ंक्शन में इंजेक्ट करने के लिए जो तर्क के रूप में लंबे समय तक int लेता है)

उत्तर

5

ठीक है, जहां तक ​​सी ++ 98/03 का संबंध है, वहां कोईlong long int नहीं है। तो मुझे लगता है कि आप सी ++ 11 के बारे में पूछ रहे हैं।

streamsize और streamoff एक अभिन्न प्रकार के typedefs होना भी आवश्यक है (streampos एक पूर्णांक नहीं है, तो आप कुछ भी है कि एक long long लेता है गुजर नहीं किया जाएगा कि)। चूंकि अभिन्न प्रकार मूल प्रकार हैं, इसलिए उन्हें केवल सी ++ या कंपाइलर-विशिष्ट परिभाषा के रूप में परिभाषित किया जा सकता है।

इस प्रकार, एकमात्र प्रश्न यह है: क्या ये टाइपपीफ long long से अधिक हैं? सभी अभिन्न प्रकार एक बड़े या बराबर आकार के रूप में परिवर्तनीय होते हैं (हस्ताक्षरित/हस्ताक्षरित बावजूद, लेकिन यहां सभी प्रकार के हस्ताक्षर किए गए हैं, इसलिए कोई समस्या नहीं है)। लेकिन अगर यह बड़ा है ... आप इसके बारे में क्या करने जा रहे हैं?

मान लीजिए कि आप उस फ़ंक्शन के हस्ताक्षर को नहीं बदल सकते हैं जिसे आप "इंजेक्शन" कर रहे हैं (क्योंकि यदि आप कर सकते हैं, तो पैरामीटर प्रकार के रूप में streamsize नहीं लेना और इस प्रकार समस्या से बचने का कोई कारण नहीं है), तो आप ' टी के पास कोई विकल्प नहीं है। आपके पास डेटा मान है जो फ़ंक्शन के मुकाबले बड़ा होता है। यहां चारों ओर घूमने का कोई तरीका नहीं है।

आप कंपाइलर को बंद करने के लिए long long में एक static_cast कर सकते हैं, लेकिन वास्तविक आकार long long में फिट नहीं हो सकता है, तो इससे कोई मदद नहीं करेगा।

आखिरकार, यह एक अव्यवस्थित समस्या है। आपके पास एक ऐसा फ़ंक्शन है जो एक पैरामीटर लेता है जो आप जो भी पारित कर रहे हैं उसके लिए संभावित रूप से बहुत छोटा है। सबसे अधिक आप यह कर सकते हैं कि यह static_assert के माध्यम से कोई समस्या हो सकती है। कुछ ऐसा:

static_assert(sizeof(std::streamsize) <= sizeof(long long), "Oops."); 

ईमानदार होने के लिए, मैं इसके बारे में चिंता नहीं करता। बाधाएं अच्छी हैं कि long long सबसे बड़ा अभिन्न आकार होगा जो आपका कंपाइलर मूल रूप से समर्थन करता है।

+0

एक्साबाइट्स फ़ाइल आकार के मामले के अलावा, लंबे समय तक रूपांतरण के दौरान कोई समस्या हो सकती है? – Vincent

+0

@ विन्सेंट: नहीं। इंटीजर प्रकारों को बिना किसी समस्या के बड़े (या बराबर आकार) पूर्णांक प्रकार में परिवर्तित किया जा सकता है। –

+0

'streampos' स्पष्ट रूप से 'स्ट्रीमऑफ' में परिवर्तित हो जाता है, इसलिए आप इसे 'लंबे समय तक' की उम्मीद करने वाले किसी चीज़ को पास कर सकते हैं। 'Streampos' और 'streamoff' के बीच का अंतर राज्य के चरित्र एन्कोडिंग के लिए समर्थन है। – Potatoswatter

1

बस जो भी फ़ंक्शन लंबे समय तक आवश्यक है, उसे मान दें। std::streamoff और std::streamsize दोनों हस्ताक्षर किए गए अभिन्न प्रकार हैं, और std::streampos स्पष्ट रूप से std::streamoff पर परिवर्तनीय है।

संपादित करें: मुझे लगता है कि स्ट्रीमिंग/स्ट्रीमऑफ long long से बड़ा नहीं होगा, अगर कोई __int128 फ़ाइल आकार के साथ आता है।

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