मैं जैसे off_t
और मुद्रित करने की कोशिश कर रहा हूँ size_t
। printf()
पोर्टेबल के लिए सही प्लेसहोल्डर क्या है ?
या क्या उन चरों को छापने का कोई अलग तरीका है?
मैं जैसे off_t
और मुद्रित करने की कोशिश कर रहा हूँ size_t
। printf()
पोर्टेबल के लिए सही प्लेसहोल्डर क्या है ?
या क्या उन चरों को छापने का कोई अलग तरीका है?
जवाबों:
आप z
size_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_t
64-बिट और 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
के लिए ऑफसेट प्रयोग किया जाता है।