অনেক কোডে ‌while(~scanf("%lf%lf%lf",&n,&a,&b) এটা দেখা যায়। এর দ্বারা EOF যাচাইয়ের কাজ হয়। কিন্তু কীভাবে হয়? গুগল করে দেখেছি, সব মাথার উপর দিয়ে যায়।

আর সি++ এ এটা ছাড়া কী অন্য উপায় নেই এন্ড অব ফাইল (EOF) যাচাই করার জন্য?

while(scanf("%d",&a)==1) দ্বারাও EOF বুঝায়, কিন্তু এর জন্য আমাকে #include <cstdio> ব্যবহার করতে হয়। এটা না ব্যবহার করে কি করা যায় না?

asked 30 Jan '17, 10:05

MD%20MOHIBUR%20RAHMAN's gravatar image

MD MOHIBUR RAHMAN
1409

edited 18 Nov, 15:57

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
63118

1

টাইটেলের তিনটা অতিরিক্ত সেমিকোলন কিছুতেই দূর হচ্ছে না, while(~scanf("%lf%lf%lf",&n;,&a;,&b;))। টাইটেল বদলে দিচ্ছি।

(18 Nov, 15:55) Mosharraf Hosain ♦

আপনি C++ এ EOF এর কাজ করা জন্য cin ব্যবহার করতে পারেন ।

while(cin >> n >> a >> b) {
    // do something until EOF
}

এই কাজটা scanf() দিয়ে করতে হলে আপনাকে লিখতে হবে,

while(scanf("%d",&a) != EOF)

অথবা,

while(scanf("%d",&a) == 1)

EOF = End of File অর্থাৎ ফাইলে যতক্ষণ ইনপুট থাকবে ততক্ষণ প্রোগ্রাম চলতে থাকবে ।

এখন প্রশ্ন হতে পারে আমরা scanf("%d",&a) == 1 কেন দিয়েছি । এর উত্তর জানার জন্য আপনি scanf() ফাংশন যেটা রিটার্ন করে তার মান প্রিন্ট করতে পারেন,

printf("Value of scanf function is : %d", scanf("%d", &a));

এই প্রিন্ট ফাংশন টি ১ প্রিন্ট করবে । আমরা যদি দুইটা ইনপুট নেই scanf("%d %d", &a, &b); দিয়ে এবং এটাও printf() দিয়ে প্রিন্ট করে করি তবে ২ প্রিন্ট করতে । একই ভাবে ৩ টা ইনপুট নিলে ৩ প্রিন্ট করবে ।

scanf() দিয়ে আমরা মোট কয়টা সংখ্যা ইনপুট নিব সেটা প্রিন্ট করবে । কোন ইনপুট না নিলে শূন্য রিটার্ন করে । এই জন্য আমরা while লুপের মধ্যে আমরা ১, ২ বা ৩ লিখে থাকি ।

যখন কোন কিছু ইনপুট নেয়ার জন্য থাকবে না তখন scanf() শূন্য রিটার্ন করবে । শূন্য হলে আমাদের while লুপের শর্ত মিথ্যা হয়ে যাবে । এবং লুপ থেকে বের হয়ে আসবে ।

এখন প্রশ্ন হল while(~scanf("%d", &a)) এই টা কেন কাজ করে । এর উত্তর জানার জন্য আপনি EOF এর মান এই ভাবে প্রিন্ট করেন ।

printf("%d", EOF);

এইটা -1 প্রিন্ট করবে তো আমরা যখন while(scanf("%d", &a) != EOF) লিখি এইটা মানে while(scanf("%d", &a) != -1) আর আমরা যখন while(~scanf("%d", &a)) লিখছি এবং scanf() কোন ইনপুট নিচ্ছে না তখন scanf() শূন্য রিটার্ন করে এবং আমরা যদি শূন্য কে ~ করি তবে সেটা -1 করে দেয় ।

int a = 0;
printf("%d", ~a); // output = -1

এখন মনে হয় আপনি আপনার উত্তর পেয়ে গেছেন ।

ধন্যবাদ :)

permanent link

answered 30 Jan '17, 10:56

menon's gravatar image

menon
4.5k330

edited 27 Apr '17, 07:08

https://vjudge.net/problem/HDU-1049 এই problem টার solution দেখতে গিয়ে আমি "~" এইটা পেলাম । দেখা গেলো acceptও হয়ে গেছে । code:http://ideone.com/OhwMjv

(30 Jan '17, 18:35) MD MOHIBUR RAHMAN

উত্তর এডিট করে দিয়েছি @MD MOHIBUR RAHMAN

(30 Jan '17, 18:37) menon

ধন্যবাদ , ভাই ।

(31 Jan '17, 12:17) MD MOHIBUR RAHMAN

শেষ প্রশ্নটার উত্তরে একটু যোগ করি, আপনাকে #include <cstdio> লিখতে হয় কারণ আপনি scanf() ফাংশনটি ব্যবহার করছেন। মেনন ভাইয়ের উত্তর অনুসারে cin ব্যবহার করলে আপনাকে cstdio হেডার ইনক্লুড করতে হবে না (যদি না আপনি printf() এবং cstdio হেডারের অন্য কোনো ফাংশন ব্যবহার করেন)।

(18 Nov, 15:48) Mosharraf Hosain ♦
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×401
×123
×9
×4

question asked: 30 Jan '17, 10:05

question was seen: 1,123 times

last updated: 18 Nov, 15:59