নীচে লাইন শীর্ষ: সাদা স্থান যথাযথভাবে পরিচালনার সাথে, নিম্নলিখিতটি কীভাবে eof
ব্যবহার করা যায় তা (এবং এমনকি fail()
ত্রুটি পরীক্ষার চেয়ে আরও নির্ভরযোগ্য হতে হবে ):
while( !(in>>std::ws).eof() ) {
int data;
in >> data;
if ( in.fail() ) /* handle with break or throw */;
// now use data
}
( ধন্যবাদ টনি ডি পরামর্শ উত্তর হাইলাইট করার জন্য। নিচে তার মন্তব্য দেখুন কেন এই আরো জোরালো হয় উদাহরণের জন্য। )
ব্যবহারের বিরুদ্ধে প্রধান যুক্তি eof()
মনে হচ্ছে সাদা স্থানের ভূমিকা সম্পর্কে একটি গুরুত্বপূর্ণ সূক্ষ্মতা অনুপস্থিত। আমার প্রস্তাবটি হ'ল, eof()
সুস্পষ্টভাবে চেক করা কেবল " সর্বদা ভুল " নয় - যা এই এবং অনুরূপ এসও থ্রেডগুলিতে একটি ওভাররাইডিং মতামত বলে মনে হয় - তবে সাদা স্থান সঠিকভাবে পরিচালনার সাথে সাথে এটি একটি ক্লিনার এবং আরও নির্ভরযোগ্য সরবরাহ করে ত্রুটি পরিচালনায়, এবং সর্বদা সঠিক সমাধান (যদিও এটি অদ্যাবধি প্রয়োজন হয় না)।
"যথাযথ" সমাপ্তি এবং পঠনের আদেশ হিসাবে কী পরামর্শ দেওয়া হচ্ছে তা সংক্ষেপে নিম্নরূপ:
int data;
while(in >> data) { /* ... */ }
// which is equivalent to
while( !(in >> data).fail() ) { /* ... */ }
ইওফের বাইরে পড়ার চেষ্টা করার কারণে ব্যর্থতা সমাপ্তির শর্ত হিসাবে নেওয়া হয়। এর অর্থ হ'ল কোনও সফল স্ট্রিম এবং ইওফ ব্যতীত অন্য কারণে সত্যই ব্যর্থ হওয়ার মধ্যে পার্থক্য করার সহজ উপায় নেই। নিম্নলিখিত স্ট্রিম নিন:
1 2 3 4 5<eof>
1 2 a 3 4 5<eof>
a<eof>
while(in>>data)
একটি সেট বন্ধ failbit
জন্য সব তিনটি ইনপুট। প্রথম এবং তৃতীয়, eofbit
এছাড়াও সেট করা হয়। অতএব লুপটি অত্যাধিক (২ য় এবং তৃতীয়) থেকে সঠিক ইনপুট (1 ম) পার্থক্য করার জন্য খুব কুরুচিপূর্ণ অতিরিক্ত যুক্তির প্রয়োজন।
তবে নিম্নলিখিতগুলি নিন:
while( !in.eof() )
{
int data;
in >> data;
if ( in.fail() ) /* handle with break or throw */;
// now use data
}
এখানে, in.fail()
যাচাই করা আছে যে যতক্ষণ পড়ার মতো কিছু আছে ততক্ষণ এটি সঠিক one এটির উদ্দেশ্য কেবলমাত্র লুপ টার্মিনেটর নয়।
এখন পর্যন্ত এত ভাল, তবে যদি স্রোতে পিছনের জায়গার জায়গা থাকে তবে কী ঘটে - eof()
টার্মিনেটর হিসাবে প্রধান উদ্বেগের মতো কি মনে হচ্ছে ?
আমাদের ত্রুটি পরিচালনার জন্য আত্মসমর্পণের দরকার নেই; শুধু সাদা স্থান খেয়ে ফেলুন:
while( !in.eof() )
{
int data;
in >> data >> ws; // eat whitespace with std::ws
if ( in.fail() ) /* handle with break or throw */;
// now use data
}
std::ws
স্ট্রিমটি স্থির করে রাখার সময় কোনও সম্ভাব্য (শূন্য বা তার বেশি) পিছনে স্থান এড়িয়ে যায় eofbit
এবং নাfailbit
। সুতরাং, in.fail()
যতক্ষণ না কমপক্ষে একটি ডেটা পড়তে হয় ততক্ষণ প্রত্যাশার মতো কাজ করে। যদি সমস্ত ফাঁকা স্ট্রিমগুলিও গ্রহণযোগ্য হয় তবে সঠিক ফর্মটি হ'ল:
while( !(in>>ws).eof() )
{
int data;
in >> data;
if ( in.fail() ) /* handle with break or throw */;
/* this will never fire if the eof is reached cleanly */
// now use data
}
সংক্ষিপ্তসার: একটি সঠিকভাবে নির্মিত while(!eof)
কেবল সম্ভব নয় এবং ভুলও নয়, তবে ডেটাগুলিকে সুযোগের মধ্যে স্থানীয়করণের অনুমতি দেয় এবং যথারীতি ব্যবসায় থেকে ত্রুটি পরীক্ষা করার ক্ষেত্রে একটি পরিষ্কারতর বিচ্ছেদ সরবরাহ করে। যা বলা হচ্ছে, while(!fail)
অকারণে এটি আরও সাধারণ এবং সংক্ষুব্ধ প্রতিমা এবং এটি সাধারণ (পাঠের ধরণের প্রতি একক ডেটা) পরিস্থিতিতে পছন্দ করা যেতে পারে।
scanf(...) != EOF
সি তেও কাজ করবে না, কারণscanf
সফলভাবে পার্স এবং নির্ধারিত ক্ষেত্রের সংখ্যা প্রদান করে। ফর্ম্যাট স্ট্রিংয়ের ক্ষেত্র সংখ্যাscanf(...) < n
যেখানে সঠিক শর্তn
।