এটি ভুল কারণ (পড়ার ত্রুটির অভাবে) এটি লেখকের প্রত্যাশার চেয়ে লুপটিতে আরও একবার প্রবেশ করে। যদি কোনও পঠন ত্রুটি থাকে তবে লুপটি কখনই শেষ হয় না।
নিম্নলিখিত কোড বিবেচনা করুন:
/* WARNING: demonstration of bad coding technique!! */
#include <stdio.h>
#include <stdlib.h>
FILE *Fopen(const char *path, const char *mode);
int main(int argc, char **argv)
{
FILE *in;
unsigned count;
in = argc > 1 ? Fopen(argv[1], "r") : stdin;
count = 0;
/* WARNING: this is a bug */
while( !feof(in) ) { /* This is WRONG! */
fgetc(in);
count++;
}
printf("Number of characters read: %u\n", count);
return EXIT_SUCCESS;
}
FILE * Fopen(const char *path, const char *mode)
{
FILE *f = fopen(path, mode);
if( f == NULL ) {
perror(path);
exit(EXIT_FAILURE);
}
return f;
}
এই প্রোগ্রামটি ধারাবাহিকভাবে ইনপুট স্ট্রিমের অক্ষরের সংখ্যার চেয়ে বড় একটিকে মুদ্রণ করবে (কোনও পঠন ত্রুটি অনুমান করে)। ইনপুট স্ট্রিমটি খালি থাকার ক্ষেত্রে বিবেচনা করুন:
$ ./a.out < /dev/null
Number of characters read: 1
এই ক্ষেত্রে, feof()
কোনও ডেটা পড়ার আগে বলা হয়, সুতরাং এটি মিথ্যা প্রত্যাবর্তন করে। লুপটি প্রবেশ করা হয়, fgetc()
তাকে বলা হয় (এবং ফিরে আসে EOF
), এবং গণনা বৃদ্ধি করা হয়। তারপরে feof()
ডাকা হয় এবং সত্য ফিরে আসে, যার ফলে লুপটি বন্ধ হয়ে যায়।
এ জাতীয় সব ক্ষেত্রেই এটি ঘটে থাকে। feof()
যতক্ষণ না সত্য ফেরত দেয় না পরে প্রবাহে একটি পঠিত ফাইলের শেষে encounters। এর উদ্দেশ্যটি feof()
পরের পঠিত ফাইলের শেষে পৌঁছবে কিনা তা যাচাই করা নয়। এর উদ্দেশ্য feof()
হ'ল পঠন ত্রুটির মধ্যে পার্থক্য করা এবং ফাইলটির শেষে পৌঁছে যাওয়া। যদি fread()
0 প্রদান করে, আপনার অবশ্যই কোনও ত্রুটির মুখোমুখি হয়েছিল কিনা বা সমস্ত ডেটা গ্রাস হয়েছে কিনা তা স্থির করতে feof
/ ব্যবহার করতে হবে ferror
। একইভাবে যদি fgetc
ফিরে আসে EOF
। feof()
শুধুমাত্র দরকারী পর fread এর শূন্য ফিরে এসেছে বা fgetc
ফিরে এসেছে EOF
। এর আগে, feof()
সর্বদা 0 এ ফিরে আসবে।
কল করার আগে সর্বদা একটি পঠনের রিটার্ন মান (যা হয় একটি fread()
, বা একটি fscanf()
, বা একটি fgetc()
) চেক করা প্রয়োজন feof()
।
আরও খারাপ, কেস পড়ার ক্ষেত্রে ত্রুটি দেখা দেয় সেখানে বিবেচনা করুন। সেক্ষেত্রে, fgetc()
আয় EOF
, feof()
আয় মিথ্যা, এবং লুপ কখনো বন্ধ। যে সমস্ত ক্ষেত্রে while(!feof(p))
ব্যবহৃত হয়, লুপের ভিতরে অবশ্যই কমপক্ষে একটি চেক থাকা উচিত ferror()
, বা খুব কমপক্ষে অবস্থার পরিবর্তিত হওয়া উচিত while(!feof(p) && !ferror(p))
বা অসীম লুপের প্রকৃত সম্ভাবনা রয়েছে, সম্ভবত সমস্ত প্রকার আবর্জনা বানান হিসাবে অবৈধ ডেটা প্রক্রিয়াজাত করা হচ্ছে।
সুতরাং, সংক্ষেপে, যদিও আমি দৃ with়তার সাথে বলতে পারি না যে " while(!feof(f))
" লেখার ক্ষেত্রে শব্দার্থগতভাবে সঠিক হতে পারে এমন কোনও পরিস্থিতি কখনও নেই (যদিও পঠনের ত্রুটির অনন্ত লুপ এড়াতে বিরতির সাথে লুপের ভিতরে আরও একটি চেক থাকা আবশ্যক) ) এটি প্রায় সর্বদা ভুল বলে মনে হয়। এমনকি যদি এটির ক্ষেত্রেও কোনও মামলা উত্থাপিত হয় তবে এটি এতটা মূর্খতার সাথে ভুল যে কোডটি লেখার সঠিক উপায় হবে না। যে কোনও কোডটি দেখলে অবিলম্বে দ্বিধা প্রকাশ করে বলা উচিত, "এটি একটি বাগ"। এবং সম্ভবত লেখককে চড় মারুন (লেখক যদি আপনার বস না হন তবে ক্ষেত্রে বিবেচনার পরামর্শ দেওয়া হয়েছে।)
feof()
কোনও লুপটি নিয়ন্ত্রণে ব্যবহার করা খারাপ