না, এটা POSIX আচরণ নয়, এটা আইএসও আচরণ (ভাল, এটি হল POSIX আচরণ কিন্তু শুধুমাত্র যতটুকু তারা আইএসও সাথে সামঞ্জস্য)।
স্ট্যান্ডার্ড আউটপুট লাইন বাফার হয় যদি এটি একটি ইন্টারেক্টিভ ডিভাইসকে উল্লেখ করার জন্য সনাক্ত করা যায়, অন্যথায় এটি পুরোপুরি বাফার করেছে। সুতরাং এমন পরিস্থিতি রয়েছে যেখানে printf
প্রবাহিত হবে না, এমনকি পাঠানোর জন্য এটি যদি নতুন লাইন পায় তবে যেমন:
myprog >myfile.txt
এটি দক্ষতার জন্য উপলব্ধি করে, আপনি যদি কোনও ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করছেন তবে তারা সম্ভবত প্রতিটি লাইন দেখতে চান। যদি আপনি কোনও ফাইলে আউটপুট প্রেরণ করেন তবে সম্ভবত অন্য প্রান্তে কোনও ব্যবহারকারী নেই এমন সম্ভাবনা রয়েছে (যদিও অসম্ভব না হলেও তারা ফাইলটি লেজু করতে পারেন)। এখন আপনি যুক্তি দিতে পারেন যে ব্যবহারকারী প্রতিটি চরিত্র দেখতে চায় তবে এতে দুটি সমস্যা রয়েছে।
প্রথমটি এটি খুব দক্ষ নয় efficient দ্বিতীয়টি হ'ল আসল এএনএসআই সি ম্যান্ডেটটি ছিল মূলত নতুন আচরণ আবিষ্কারের পরিবর্তে বিদ্যমান আচরণকে কোডিং করা এবং এএনএসআই প্রক্রিয়া শুরু করার অনেক আগে থেকেই এই নকশাগুলির সিদ্ধান্ত নেওয়া হয়েছিল। এমনকি আইএসও আজকাল মানগুলিতে বিদ্যমান নিয়মগুলি পরিবর্তন করার সময় খুব সাবধানতার সাথে পদক্ষেপ করে।
কীভাবে এটি মোকাবেলা করতে হয়, আপনি যদি fflush (stdout)
প্রতিটি আউটপুট কল করার পরে কল করে থাকেন যে আপনি অবিলম্বে দেখতে চান, এটি সমস্যার সমাধান করবে।
বিকল্পভাবে, setvbuf
অপারেট করার আগে stdout
আপনি এটি অপ্রয়োজনীয়তে সেট করতে ব্যবহার করতে পারেন এবং আপনার কোডটিতে এই সমস্ত fflush
লাইন যুক্ত করার বিষয়ে আপনাকে চিন্তা করতে হবে না :
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
শুধু মন যদি আপনার কর্মক্ষমতা বেশ একটু প্রভাবিত হতে পারে যে রাখা হয় একটি ফাইলে আউটপুট পাঠানো। এছাড়াও মনে রাখবেন যে এর জন্য সমর্থন বাস্তবায়ন-সংজ্ঞায়িত, মান দ্বারা গ্যারান্টিযুক্ত নয়।
আইএসও সি 99 বিভাগটি 7.19.3/3
প্রাসঙ্গিক বিট:
যখন একটি স্ট্রিম আনফার্ড করা না হয় , অক্ষরগুলি উত্স থেকে বা গন্তব্যে যত তাড়াতাড়ি সম্ভব উপস্থিত হওয়ার উদ্দেশ্য। অন্যথায় অক্ষরগুলি ব্লক হিসাবে হোস্ট পরিবেশে বা থেকে সংগ্রহ করা বা সংক্রমণ হতে পারে।
যখন একটি স্ট্রিম পুরোপুরি বাফার হয় , বাফারগুলি পূর্ণ হয়ে গেলে অক্ষরগুলি হোস্ট পরিবেশে বা একটি ব্লক হিসাবে স্থানান্তরিত করার উদ্দেশ্যে হয়।
যখন একটি স্ট্রিম লাইন বাফার হয় , অক্ষরগুলি যখন একটি নতুন-লাইন চরিত্রের মুখোমুখি হয় তখন একটি হোস্ট হিসাবে হোস্ট পরিবেশে বা থেকে একটি ব্লক হিসাবে প্রেরণ করা হয়।
তদ্ব্যতীত, বাফার ভরাট হয়ে গেলে, যখন একটি বাফার স্ট্রিমে ইনপুট অনুরোধ করা হয় বা যখন লাইন বাফার স্ট্রিমে ইনপুট অনুরোধ করা হয় যার জন্য হোস্ট পরিবেশ থেকে অক্ষরের সংক্রমণ প্রয়োজন হয় তখন অক্ষরগুলি হোস্ট পরিবেশে একটি ব্লক হিসাবে সঞ্চারিত হয় ।
এই বৈশিষ্ট্যগুলির জন্য সমর্থন বাস্তবায়ন-সংজ্ঞায়িত এবং এটি setbuf
এবং setvbuf
ক্রিয়াকলাপগুলির মাধ্যমে প্রভাবিত হতে পারে ।