2011-09-08 7 views
8

यदि मैं बाइट्स में फ़ाइल आकार रखने के लिए double जैसे कुछ उपयोग करता हूं, तो यह स्वाभाविक रूप से बहुत जल्द विफल हो जाएगा, तो मैं किस डेटा प्रकार का उपयोग करूंगा? आजकल कुछ टीबी आम हैं, इसलिए मैं डेटा प्रकार को बड़ी संख्या में रखने में सक्षम होना चाहता हूं।सी: बाइट्स में फ़ाइल आकारों के लिए उपयोग करने के लिए सही डेटा प्रकार क्या है?

+0

+1 कुछ फर्जी का उपयोग करने के बजाय पूछने के लिए परेशान करने के लिए +1। :-) और एसओ में आपका स्वागत है! –

उत्तर

6

यह आपके मंच पर निर्भर करेगा। यूनिक्स सिस्टम पर, आप शायद off_t प्रकार का उपयोग कर सकते हैं। विंडोज़ पर, आप शायद LARGE_INTEGER का उपयोग करना चाहेंगे। वे सिस्टम पर फ़ाइल आकार (stat यूनिक्स, GetFileSize विंडोज़ पर वापस लौटने वाले फ़ंक्शन द्वारा उन सिस्टमों पर उपयोग किए जाने वाले प्रकार हैं)।

यदि आप एक पोर्टेबल प्रकार चाहते हैं, uint64_t पर्याप्त होना चाहिए।

+0

एक त्वरित Google सत्र के बाद ऐसा लगता है कि uint64_t मैं चाहता हूं। धन्यवाद! मैं प्रतिक्रियाओं और प्रतिक्रिया समय की संख्या से अभिभूत हूं। तो आश्चर्यजनक है! – EnibMoc1994

+1

@ एनआईबीएमओसी 1 9 4 9: आप 'लंबे समय तक' या इसके हस्ताक्षरित साथी का भी उपयोग कर सकते हैं, जो कम से कम 64 बिट्स होने की गारंटी है। – caf

1

size_t सी में filesizes के लिए सामान्य है एक पॉप पसंदीदा :) है, लेकिन यह के प्रकार के मंच निर्भर (विंडोज पर 32-बिट या 64-बिट अहस्ताक्षरित int) है। मैं सुझाव देता हूं कि __int64 (एक 64-बिट int) - 138,547,332 टेराबाइट्स का सामना करना चाहिए।

संपादित करें: बस जांचें, विंडोज एपीआई कॉल GetFileSizeEx आपको एक LARGE_INTEGER प्राप्त करता है, जो 64-बिट हस्ताक्षरित पूर्णांक है। तो LARGE_INTEGER भी एक अच्छा होगा।

+2

रिकॉर्ड के लिए, 64 बिट बिल्ड में आकार में 'size_t' 64 बिट आकार है। –

+0

यह _not_ एक 'हस्ताक्षरित int' है, यह एक हस्ताक्षरित अभिन्न प्रकार है। – paxdiablo

+0

माफी, @ पक्सडीब्लो, यह वास्तव में प्लेटफार्म निर्भर है जैसा आप इंगित करते हैं। 32-बिट का उपयोग कर विंडोज़ पर यह एक हस्ताक्षरित int के बराबर है। पिछली बार मुझे विश्वास है कि विजुअल स्टूडियो मुझे क्या बताता है। :) मेरे जवाब को और सटीक होने के लिए संपादित किया है। यहां अधिक जानकारी: http://en.wikipedia.org/wiki/Size_t –

2

ftello() नामक एक फ़ंक्शन है जो off_t देता है।

fgetpos() के साथ, आपको fpos_t वैरिएबल की आवश्यकता है - संपादित करें: जो आवश्यक अंकगणितीय प्रकार नहीं है।

तो off_t आपकी आवश्यकताओं के अनुसार उपयुक्त/उपयुक्त होना चाहिए, और आपको वास्तविक डेटा प्रकार के आकार से स्वतंत्र रखता है।

+0

बस सावधान रहें कि 'ftello' और' off_t' पॉज़िक्स हैं, मानक सी नहीं –

+0

यदि आपके पास 'off_t' नहीं है तो आपके पास 'ftello' नहीं है और फ़ाइल ऑफसेट बड़े होने के लिए कोई (पोर्टेबल) तरीका नहीं है 'long' से ... –

1

आप off_t का उपयोग करना चाहते हैं, क्योंकि यह fseeko और ftello उपयोग के मानक कार्यों जैसे है।

1

libc statoff_t का उपयोग करता है, जो एक हस्ताक्षरित, 64-बिट चौड़े प्रकार के लिए टाइपेडफ है। यह थोड़ी देर के लिए उपयुक्त होगा।

+0

off_t ओएस एक्स पर लंबे समय तक हस्ताक्षरित के लिए टाइपपीफ है। –

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

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