আমি কীভাবে অফ_টি এবং আকার_t এর মতো প্রিন্ট করব?


148

আমি off_tএবং এর মতো প্রিন্ট প্রিন্ট করার চেষ্টা করছি size_tprintf() পোর্টেবলের জন্য সঠিক স্থানধারক কী ?

বা এই ভেরিয়েবলগুলি মুদ্রণের জন্য কি সম্পূর্ণ আলাদা উপায় আছে?


2
@devin: আমি বিশ্বাস করি ব্যবহার করার সময় আমি যে টাইপ পেয়েছি fopen, fseek, ম্যাক OS X এর উপর ইত্যাদি off_tজন্য অফসেট ব্যবহার করা হয়।
জর্জি স্কলি

উত্তর:


112

আপনি আকার_t zএবং tptrdiff_t এর মতো ব্যবহার করতে পারেন

printf("%zu %td", size, ptrdiff);

তবে আমার ম্যানপেজটি বলেছে যে কিছু পুরানো গ্রন্থাগার zএটির চেয়ে আলাদা চরিত্র ব্যবহার করেছে এবং এর ব্যবহারকে নিরুৎসাহিত করে। তবুও, এটি মানক করা হয়েছে (সি 99 স্ট্যান্ডার্ড দ্বারা)। তাদের জন্য 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যথাক্রমে ফরম্যাটের।


2
অফ_টি আসলে আমার সিস্টেমে একটি স্বাক্ষরিত দীর্ঘ দীর্ঘ।
জর্জি স্কলি

2
আমি মনে করি ম্যান পৃষ্ঠাটি জেড (বড় হাতের) ব্যবহারকে নিরুৎসাহিত করে যা libc5 দ্বারা ব্যবহৃত হয়েছিল। এটি z (লোয়ারকেস) নিরুৎসাহিত করে বলে মনে হচ্ছে না।
ড্রিমন

12
ব্যবহার %zdএকটি সঙ্গে size_tহয় অনির্ধারিত আচরণ signedness মেলেনি (C99 7.19.6.1 # 9) কারণে। এটা অবশ্যই হবে %zu
জেনস

7
ঠিক আছে, তাহলে কীভাবে প্রিন্ট করা যায়?
জনিটেক্স

3
@ জেনস আমি দেখতে পাচ্ছি না যে কীভাবে সেই অনুচ্ছেদে বা অন্য কোনওরকমের %zdসাথে size_tসংজ্ঞায়িত আচরণ হয়। প্রকৃতপক্ষে, %z# 7- এর সংজ্ঞাটি স্বাক্ষরযুক্ত প্রকারের %dসাথে size_tএবং স্বাক্ষরিত প্রকারের সাথে স্পষ্টভাবে অনুমতি দেয় এবং .26.2.5 # 9 স্বাক্ষরযুক্ত স্বাক্ষরিত প্রকারের প্রত্যাশিত যেখানে স্বাক্ষরিত প্রকারের প্রত্যাশা করা হয় ততক্ষণ স্পষ্টভাবে মঞ্জুরি দেয়, যতক্ষণ মানটি একটি বৈধ অবৈধ মান হিসাবে হয় স্বাক্ষরিত ধরণের।
Chortos-2

108

মুদ্রণ করতে 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 তে রয়েছেন) তবে আফ্রিকের থেকে আপনার কিছুটা সমস্যা আছে যেহেতু সি 89 এ পূর্ণসংখ্যার ধরণ নেই যা ফরম্যাটিং কোড রয়েছে এবং এটির চেয়ে বড় হওয়ার গ্যারান্টি রয়েছে এই ধরনের হিসাবে। সুতরাং আপনার বাস্তবায়ন-নির্দিষ্ট কিছু করা দরকার।

উদাহরণস্বরূপ, যদি আপনার সংকলকটি থাকে long longএবং আপনার মানক গ্রন্থাগারটি সমর্থন করে %lld, আপনি আত্মবিশ্বাসের সাথে আশা করতে পারেন যে এটি তার জায়গায় কার্যকর হবে intmax_t। তবে যদি তা না হয় তবে আপনাকে ফিরে যেতে হবে long, যা এটি খুব ছোট কারণ এটি অন্য কয়েকটি বাস্তবায়নে ব্যর্থ হবে।


3
এটি এখন পর্যন্ত আরও ভাল উত্তর, আমি স্বাক্ষরবিহীন আকার_t এর জন্য% zu ব্যবহার করতে ভুলে যেতাম। এবং যে কোনও প্ল্যাটফর্মে অফ_টি যাই থাকুক না কেন ইন্টম্যাক্স_t এ কাস্ট করা একটি দুর্দান্ত সমাধান।
পিটার কর্ডস

2
পোজিক্স ssize_tএর সমান আকারের গ্যারান্টি দেয় না size_t, সুতরাং সত্যিকারের পোর্টেবল কোডটিকে এটিকে রূপান্তর করা উচিত intmax_tএবং %jdঠিক একইভাবে মুদ্রণ করা উচিত off_t
nwellnhof

অফ_টি দৈর্ঘ্যের আকার পর্যন্ত দীর্ঘ হতে পারে এবং সংজ্ঞায়িতগুলির উপর নির্ভর করে পরিবর্তনশীল হতে পারে ... ভিজ্যুয়াল স্টুডিও এটির সাথে সতর্ক করে "C4477: '_snprintf_s': ফর্ম্যাট স্ট্রিং '% jd' এর জন্য '__int64' টাইপের একটি আর্গুমেন্ট প্রয়োজন, তবে ভিন্নতর আর্গুমেন্ট 1 'অফ_টি' "টাইপ আছে ... একটি সত্যই বহনযোগ্য উপায় হ'ল প্রিন্টফ ("% lld \ n ", (দীর্ঘ দীর্ঘ) এক্স);
এরিক্কার্টিন

5

মাইক্রোসফ্টের জন্য উত্তরটি আলাদা। ভিএস2013 মূলত সি 99 এর সাথে সম্মতিযুক্ত তবে "[টি] তিনি এইচ, জে, জেড এবং টি দৈর্ঘ্যের উপসর্গ সমর্থিত নয়।" সাইজ_টি "এর জন্য, যা 32-বিট প্ল্যাটফর্মে স্বাক্ষরযুক্ত __int32, 64-বিট প্ল্যাটফর্মগুলিতে স্বাক্ষরবিহীন __int64" টাইপ স্পেসিফার ও, ইউ, এক্স, বা এক্স সহ প্রিফিক্স I (মূল চোখ) ব্যবহার করুন V ভিএস2013 আকারের বিশদকরণ দেখুন

অফ_টি হিসাবে, এটি ভিসি হিসাবে দীর্ঘ হিসাবে সংজ্ঞায়িত করা হয়েছে \ অন্তর্ভুক্ত \ সিএস \ প্রকার।


যদি off_tএটি সর্বদা long32-বিট করে তোলে তা নোট করুন (এমনকি 64-বিট উইন্ডোজ এর জন্য 32-বিট ব্যবহার করে long)।
সোর্সজেডি

3

আপনি সি এর কোন সংস্করণ ব্যবহার করছেন?

সি 90-এ, আদর্শ অনুশীলনটি হ'ল স্বাক্ষরিত বা স্বাক্ষরিত দীর্ঘ, যথাযথ হিসাবে কাস্ট করা এবং সেই অনুযায়ী প্রিন্ট করা। আমি আকার_t এর জন্য% z দেখেছি, তবে হার্বিসন এবং স্টিল প্রিন্টফ () এর আওতায় এটি উল্লেখ করে না, এবং যে কোনও ক্ষেত্রে আপনাকে পিটিডিফ_টি বা যে কোনও ক্ষেত্রে সহায়তা করবে না।

C99- তে বিভিন্ন _ টি প্রকারের নিজস্ব প্রিন্টফ ম্যাক্রোগুলি নিয়ে আসে, সুতরাং এর মতো কিছু "Size is " FOO " bytes." আমি বিশদ জানি না, তবে এটি ফাইলের অন্তর্ভুক্ত মোটামুটি বড় সংখ্যার বিন্যাসের অংশ।


3

আপনি ইন্টি টাইপস.h থেকে ফর্ম্যাটিং ম্যাক্রোগুলি ব্যবহার করতে চাইবেন।

এই প্রশ্নটি দেখুন: আকার_t টাইপের ভেরিয়েবলের জন্য ক্রস প্ল্যাটফর্ম ফর্ম্যাট স্ট্রিং?


ধরে নিই যে অফ_টি একটি স্বাক্ষরযুক্ত, পয়েন্টার আকারের ইন্টি (আমি জানি না যে সুনির্দিষ্ট সংজ্ঞাটি কী) পিটিআরডিফ_টি এর পরে আপনি পিআরআইডিপিটিআর বা পিআরআইপিটিআর ব্যবহার করবেন।
মাইকেল বুড় 20

11
off_tটাইপ কোনো 32-বিট সিস্টেমে একটি পয়েন্টার যে বড় ফাইল (যা অধিকাংশ 32 বিট সিস্টেম এই দিন হয়) সমর্থন চেয়ে বড়।
ডায়েটারিচ এপ্পে

1
@ ডায়েটারিচএপ্প: আসলে, এটি এর চেয়েও খারাপ; অনেকগুলি 32-বিট সিস্টেমে অফ_টি এবং অফ 64_t উভয়ই থাকে এবং ম্যাক্রোস অফ_ বৈশিষ্ট্যটির উপর নির্ভর করে প্রকৃতপক্ষে অফ _৪_টি অর্থ হতে পারে।
সামব

1

এ খুঁজছি man 3 printfলিনাক্স, OS X এর, এবং জন্য সব প্রদর্শনী সমর্থন OpenBSD %zজন্য size_tএবং %tজন্য ptrdiff_t(C99 জন্য) কিন্তু যারা উল্লেখ কেউই off_t। বন্য এ প্রস্তাবনা সাধারণত আপ অফার %uজন্য রূপান্তর off_t, যা "সঠিক যথেষ্ট" যতদূর আমি (উভয় বলতে পারেন হয় unsigned intএবং off_t64-বিট এবং 32 বিট ব্যবস্থার মধ্যে অভিন্নরুপে পরিবর্তিত হতে)।


1
আমার সিস্টেমে (ওএস এক্স) 32-বিট unsigned intএবং 64-বিট রয়েছে off_t। সুতরাং theালাই ডেটা হারাতে পারে।
ডায়েটারিচ এপ্পে

-3

আমি এই পোস্টটি কমপক্ষে দু'বার দেখেছি কারণ গ্রহণযোগ্য উত্তরটি আমার পক্ষে মনে রাখা খুব কঠিন (আমি খুব কমই ব্যবহার করি zবা jপতাকা ব্যবহার করি এবং সেগুলি প্ল্যাটফর্মটি স্বতন্ত্র নয় বলে মনে হয় )।

মান বলছেন না পরিষ্কারভাবে সঠিক তথ্য দৈর্ঘ্য size_t, তাই আমি আপনাকে পরামর্শ দিচ্ছি আপনি যদি প্রথম দৈর্ঘ্য পরীক্ষা করা উচিত size_tআপনার প্ল্যাটফর্মে তারপর তাদের একটি নির্বাচন করুন:

if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64

এবং আমি stdintদৃistan়তার জন্য কাঁচা ডেটা প্রকারের পরিবর্তে প্রকারগুলি ব্যবহার করার পরামর্শ দিচ্ছি ।


1
C99 এবং C11 এর জন্য, মানটি স্পষ্টভাবে জানিয়ে দেয় যে মানগুলি %zuমুদ্রণের জন্য ব্যবহার করা যেতে পারে size_t। মুদ্রণের জন্য অবশ্যই কোনও uint32_t/ uint64_tফর্ম্যাট স্পেসিফায়ার ব্যবহার করা উচিত নয়size_t , কারণ এই ধরণেরগুলি উপযুক্ত কিনা তার কোনও গ্যারান্টি নেই।
অটিস্টিক

-4

যেমনটি আমি মনে করি, এটি করার একমাত্র পোর্টেবল উপায় হ'ল ফলাফলটি "স্বাক্ষরবিহীন দীর্ঘ ইনট" এ ফেলে দেওয়া এবং ব্যবহার করা %lu

printf("sizeof(int) = %lu", (unsigned long) sizeof(int));

1
"% Lu" হওয়া উচিত, কারণ রূপান্তর হওয়ার আগে দৈর্ঘ্য সংশোধক হওয়া উচিত।
dwc

1
অফ_ টি উদাহরণ স্বাক্ষরিত দীর্ঘ দীর্ঘ।
জর্জি স্কলি

@ জর্জিস্কলি - তারপরে আপনি একটি ধাক্কা মারলেন, কারণ long longসি ++ স্ট্যান্ডার্ডে নেই এবং এইভাবে সহজাতভাবে অ-বহনযোগ্য।
জেমস করান

-9

অফ_টি এর জন্য "% জো" ব্যবহার করুন। (অষ্টাল) বা দশমিকের জন্য "% zu"।


আপনি কেন অষ্টালে ফাইল অফসেট চান?
পুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.