मैं जैसे off_tऔर मुद्रित करने की कोशिश कर रहा हूँ size_t। printf() पोर्टेबल के लिए सही प्लेसहोल्डर क्या है ?
या क्या उन चरों को छापने का कोई अलग तरीका है?
मैं जैसे off_tऔर मुद्रित करने की कोशिश कर रहा हूँ size_t। printf() पोर्टेबल के लिए सही प्लेसहोल्डर क्या है ?
या क्या उन चरों को छापने का कोई अलग तरीका है?
जवाबों:
आप zsize_t के लिए और tजैसे ptrdiff_t के लिए उपयोग कर सकते हैं
printf("%zu %td", size, ptrdiff);
लेकिन मेरा मेन्यू कहता है कि कुछ पुराने पुस्तकालय ने इसके इस्तेमाल से zहतोत्साहित किया है। फिर भी, यह मानकीकृत है (C99 मानक द्वारा)। उन लोगों के लिए intmax_tऔर int8_tकी stdint.hऔर इतने पर, वहाँ मैक्रो आप उपयोग कर सकते हैं, जैसे एक और उत्तर कहा हैं:
printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);
वे के पेज में सूचीबद्ध हैं inttypes.h।
व्यक्तिगत रूप से, मैं सिर्फ एक unsigned longया longदूसरे जवाब की सिफारिश करने के लिए मान डालूंगा। आप, तो आप (और, ज़ाहिर है चाहिए) डाली कर सकते हैं C99 का उपयोग करते हैं unsigned long longया long longऔर प्रयोग %lluया %lldक्रमशः प्रारूपों।
%zdएक साथ size_tहै अपरिभाषित व्यवहार signedness बेमेल (C99 7.19.6.1 # 9) की वजह से। यह होना ही चाहिए %zu।
%zdके साथ एक size_tहै कि पैरा से या किसी अन्य से अपरिभाषित व्यवहार हो जाता है। वास्तव में, %z# 7 की परिभाषा स्पष्ट रूप %dसे size_tऔर संबंधित हस्ताक्षरित प्रकार के साथ अनुमति देती है , और the6.2.5 # 9 स्पष्ट रूप से अहस्ताक्षरित प्रकारों के मूल्यों का उपयोग करने की अनुमति देता है जहां संबंधित हस्ताक्षरित प्रकार की अपेक्षा की जाती है, जब तक कि मूल्य एक मान्य नॉनगेटिव मूल्य है हस्ताक्षरित प्रकार।
मुद्रित करने के लिए off_t:
printf("%jd\n", (intmax_t)x);
मुद्रित करने के लिए size_t:
printf("%zu\n", x);
मुद्रित करने के लिए ssize_t:
printf("%zd\n", x);
C99 मानक में 7.19.6.1/7, या कोडिंग प्रारूप के अधिक सुविधाजनक POSIX दस्तावेज देखें:
http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html
यदि आपका कार्यान्वयन उन फ़ॉर्मेटिंग कोडों का समर्थन नहीं करता है (उदाहरण के लिए क्योंकि आप C89 पर हैं), तो आपके पास थोड़ी सी समस्या है क्योंकि AFAIK में C89 में पूर्णांक प्रकार नहीं हैं जिनमें कोड स्वरूपण हैं और बड़े होने की गारंटी है इन प्रकारों के रूप में। इसलिए आपको कुछ कार्यान्वयन-विशिष्ट करने की आवश्यकता है।
उदाहरण के लिए यदि आपका कंपाइलर है long longऔर आपका मानक पुस्तकालय समर्थन करता है %lld, तो आप विश्वास के साथ उम्मीद कर सकते हैं कि इसकी जगह काम करेगा intmax_t। लेकिन अगर ऐसा नहीं होता है, तो आपको वापस गिरना longहोगा, जो कुछ अन्य कार्यान्वयन पर विफल होगा क्योंकि यह बहुत छोटा है।
ssize_tइसका आकार एक जैसा है size_t, इसलिए वास्तव में पोर्टेबल कोड को इसे उसी तरह बदलना चाहिए intmax_tऔर प्रिंट करना चाहिए %jdजैसे कि off_t।
Microsoft के लिए, उत्तर अलग है। VS2013 काफी हद तक C99 के अनुरूप है लेकिन "[t] वह hh, j, z, और t लंबाई उपसर्ग का समर्थन नहीं करता है।" Size_t "के लिए, 32-बिट प्लेटफ़ॉर्म पर अहस्ताक्षरित __int32, 64-बिट प्लेटफ़ॉर्म पर अहस्ताक्षरित __int64" प्रकार स्पेसर ओ, यू, एक्स, या एक्स के साथ "उपसर्ग I (पूंजी आंख) का उपयोग करें" देखें। VS2018 आकार विनिर्देश
जैसा कि off_t के लिए है, यह वीसी में शामिल है जब तक कि \ sys \ types.h शामिल नहीं हैं।
off_tहमेशा longऐसा होता है तो यह 32-बिट (64-बिट विंडोज के लिए 32-बिट का उपयोग करता है long) कर देगा।
C का कौन सा संस्करण उपयोग कर रहे हैं?
C90 में, मानक अभ्यास पर हस्ताक्षर किए गए या लंबे समय तक, उचित रूप में, और तदनुसार मुद्रित करने के लिए डाली जाती है। मैंने size_t के लिए% z देखा है, लेकिन हार्बिसन और स्टील ने इसका उल्लेख printf () के तहत नहीं किया है, और किसी भी स्थिति में जो आपको ptrdiff_t या जो भी मदद नहीं करेगा।
C99 में, विभिन्न _t प्रकार अपने स्वयं के प्रिंटफ मैक्रोज़ के साथ आते हैं, इसलिए कुछ ऐसा है जो "Size is " FOO " bytes." मुझे विवरण नहीं पता है, लेकिन यह काफी बड़े संख्यात्मक प्रारूप का हिस्सा है जिसमें फ़ाइल शामिल है।
आप inttypes.h से स्वरूपण मैक्रो का उपयोग करना चाहते हैं।
यह प्रश्न देखें: type size_t के चर के लिए प्लेटफ़ॉर्म प्रारूप स्ट्रिंग?
off_tप्रकार किसी भी 32-बिट सिस्टम पर एक सूचक है कि बड़ी फ़ाइलों (जो सबसे अधिक 32-बिट सिस्टम इन दिनों है) का समर्थन करता है से बड़ा है।
को देखते हुए man 3 printfलिनक्स, ओएस एक्स पर, और के लिए सभी शो समर्थन OpenBSD %zके लिए size_tऔर %tके लिए ptrdiff_t(C99 के लिए), लेकिन उन में से कोई भी उल्लेख off_t। जंगली में सुझाव आमतौर पर की पेशकश %uके लिए रूपांतरण off_tहै, जो "सही पर्याप्त" जहाँ तक मैं (दोनों बता सकते है unsigned intऔर off_t64-बिट और 32-बिट सिस्टम के बीच समान रूप से भिन्न हो)।
unsigned intऔर 64-बिट है off_t। इसलिए कास्ट डेटा खो जाएगा।
मैंने इस पोस्ट को कम से कम दो बार देखा, क्योंकि स्वीकृत उत्तर मेरे लिए याद रखना मुश्किल है (मैं शायद ही कभी उपयोग करता हूं zया jझंडे और उन्हें लगता है कि मंच स्वतंत्र नहीं है )।
मानक कहते हैं कभी नहीं स्पष्ट रूप से की सटीक डेटा लंबाई size_t, तो मैं सुझाव है कि आप पहले लंबाई की जाँच करनी चाहिए size_tअपने मंच पर तो उनमें से एक का चयन करें:
if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64
और मैं सुझाव देता हूं कि stdintनिरंतरता के लिए कच्चे डेटा प्रकारों के बजाय प्रकारों का उपयोग करें ।
%zuइसका उपयोग size_tमूल्यों को प्रिंट करने के लिए किया जा सकता है । किसी को प्रिंट करने के लिए निश्चित रूप सेuint32_t / uint64_tफॉर्मेट स्पेसियर का उपयोग करने का सहारा नहीं लेना चाहिए size_t, क्योंकि इस बात की कोई गारंटी नहीं है कि वे प्रकार संगत हैं।
जैसा कि मुझे याद है, इसे करने का एकमात्र पोर्टेबल तरीका है, परिणाम को "अहस्ताक्षरित लंबे समय तक int" और उपयोग के लिए डालना है %lu।
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
long longसी ++ मानक में मौजूद नहीं है, और इस प्रकार स्वाभाविक रूप से गैर-पोर्टेबल है।
fopen,fseek, मैक ओएस एक्स पर आदिoff_tके लिए ऑफसेट प्रयोग किया जाता है।