C/C++ টিউটোরিয়াল : C++ Input/Output (I/O) Stream (অধ্যায়-১.১)

0
487

1.1 : Unformatted I/O Operations

কোন প্রোগ্রামে কীবোর্ড থেকে কিংবা ফাইল থেকে ডাটা নিয়ে ভেরিয়েবল (variable) এ রাখা কিংবা ভেরিয়েবল (variable) থেকে ডাটা নিয়ে মনিটর কিংবা ফাইল-এ রাখা মানে হল ডাটাকে এক জায়গা থেকে অন্য জায়গায় পাঠানো। সহজ ভাষায় ডাটাকে এক জায়গা থেকে অন্য জায়গায় পাঠানোকে, অর্থাৎ ডাটার প্রবাহকে বলা হয় Data Stream। এই অধ্যায়ে আমরা C++ ল্যাঙ্গুয়েজ এ কী-বোর্ড থেকে ডাটা নিয়ে কীভাবে ভেরিয়েবল এ রাখা যায় এবং ভেরিয়েবল এ রাখা ডাটাকে কীভাবে মনিটর-এ আউটপুট হিসেবে দেখানো যায় সে ব্যাপারে আলোচনা করব।
C++ এ ইনপুট/আউটপুট (I/O) এর এই কাজটা করা হয় C++ এর কিছু built in class বা object ব্যবহার করে এবং এগুলোকে বলা হয় I/O (Input/Output) Stream Object। cin এবং cout হচ্ছে সেই অবজেক্টের দুটি উদাহরণ। C ল্যাঙ্গুয়েজ এ এই কাজটা করা হয়ে থাকে printf () এবং scanf () ফাংশন ব্যবহার করে। C++, C এর-ই উন্নত সংস্করণ, বিধায় C এর সব উপাদান-ই C++ এ ব্যবহার করা যায়। তাই আমরা চাইলে ডাটা ইনপুট/আউটপুট (I/O) এর জন্য printf () এবং scanf () ফাংশন-ও ব্যবহার করতে পারি। তবে আমার উদ্দেশ্য যেহেতু C++ নিয়ে আলোচনা করা, তাই আমি পরবর্তীতে বিভিন্ন প্রোগ্রামে cin এবং cout অবজেক্ট দুটোই ব্যবহার করবো প্রোগ্রামিং এর কাজে। মূলত এ কারণেই প্রথমে আমি এই বিষয়টা নিয়ে আলোচনা করছি।
C++ এ data stream এর কাজে প্রাথমিকভাবে overloaded shift operator ‘<<’ (insertion operator) এবং ‘>>’ (extraction operator) অপারেটর ব্যবহার করা হয়। ‘>>’ এই অপারেটরটা istream class এ এবং ‘<<’ অপারেটরটা ostream class এ overload করা হয়েছে। cin এবং cout অবজেক্ট দুটোকে ব্যবহার করতে চাইলে আমাদের iostream হেডারটা ব্যবহার করতে হবে। নিচের প্রোগ্রামটা দেখা যাক-

 

#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cout << “Enter the first value (a) : “;
cin >> a;
cout << “Enter the second value (b) : “;
cin >> b;
c = a + b;
cout << “a + b = ” << c << endl; //endl is used instead of \\n for new line
return 0;
}

 

প্রথম লাইনটা হচ্ছে- #include <iostream>। এটি header ব্যবহারের নতুন পদ্ধতি, যা ANSI C++ কর্তৃক নির্ধারিত। পূর্বে header হিসেবে iostream.h ব্যবহার করা হতো, সেক্ষেত্রে using namespace std; ব্যবহার করার প্রয়োজন হতো না। কিন্তু নতুন পদ্ধতি অনুসারে শেষে .h ব্যবহার না করে using namespace std; ব্যবহার করা হয়। C++ এর সব class, function এবং template কে namespace এর std তে declare করা হয়েছে। using namespace স্টেটমেন্টটা কম্পাইলারকে বলে দেয় যে, যে সকল মেম্বারগুলো std namespace এ define করা হয়েছে, সেগুলো প্রোগ্রামে বিভিন্ন সময়ে বিভিন্ন জায়গায় ব্যবহৃত হবে। পরের লাইনে লেখা int a, b, c; স্টেটমেন্টটি দ্বারা integer টাইপের তিনটি ভেরিয়েবল ডিক্লেয়ার করা হয়েছে। এরপরের লাইনে লেখা cout << “Enter the first value (a) : “; স্টেটমেন্টটির কাজ হচ্ছে মনিটরে Enter the first value (a) : লেখাটা আউটপুট দেখানো। পরবর্তী লাইনে কম্পাইলার cin >> a; স্টেটমেন্টটির জন্য user এর ইনপুট এর অপেক্ষায় থাকবে। এখানে একটি integer টাইপের ভ্যালু (অবশ্যই সীমার মধ্যে থাকতে হবে) দিয়ে enter প্রেস করা হলে, কম্পাইলার সেটিকে a ভেরিয়েবল এর মধ্যে রাখবে এবং পরবর্তীতে ধারাবাহিকভাবে প্রতিটি স্টেটমেন্ট এর কাজ শেষ করে a ও b এর যোগফল প্রিন্ট করে দেখাবে। আশা করি এই পর্যন্ত পড়ে পাঠকরা বুঝতে পারছেন যে, প্রোগ্রামে cin এবং cout অবজেক্ট দুটো কীভাবে কাজ করেছে। এবার নিচের প্রোগ্রামটি দেখা যাক-

 

#include <iostream>
using namespace std;
main()
{
char name[25];
cout << “Enter Your Name : “;
cin >> name;
cout << name <<endl;
return 0;
}

 

এই প্রোগ্রামটা কম্পিউটার এ রান করলে মনিটরে Enter Your Name : লেখাটা দেখা যাবে এবং কম্পাইলার user এর ইনপুট এর জন্য অপেক্ষা করবে। ইনপুট দেয়ার সময় খেয়াল রাখা প্রয়োজন, ইনপুট এ দেয়া ক্যারেক্টার সংখ্যা যেন array এর সীমা অতিক্রম না করে। name ভেরিয়েবলে NULL character- টি সহ সর্বাধিক 25 টি ক্যারেকটার রাখা যাবে এবং এই সীমার মধ্যে name ভেরিয়েবলটি মনিটরে আউটপুট দেখাবে। এখন যদি উপরের প্রোগ্রামে ইনপুট হিসেবে Object লিখে enter কী প্রেস করা হয়, তাহলে আউটপুট হিসেবে মনিটরে Object লেখাটা দেখা যাবে। কিন্তু যদি Object Oriented Programming লিখে enter কী প্রেস করা হয়, তাহলে-ও শুধুমাত্র Object লেখাটাই দেখা যাবে। প্রশ্ন হচ্ছে- এর কারণটা কী? কারণটা হচ্ছে- cin অবজেক্ট ব্যবহার করে শুধুমাত্র space পর্যন্ত ইনপুট নেয়া যায়। কিন্তু যদি টেক্সট এর একটি লাইন ইনপুট দিতে হয়, সেক্ষেত্রে কী হবে? এই প্রশ্নের উত্তরটা নিয়েই পরবর্তীতে আমরা আলোচনা করব। তার পূর্বে আমরা দুটো member function নিয়ে আলোচনা করব, এগুলো হচ্ছে- get() এবং put()। এই ফাংশন দুটো যথাক্রমে cin এবং cout এর সাথে I/O এর জন্য ব্যবহার করা হয়।

উল্লেখ্য যে, get() এবং put() member function দুটো যথাক্রমে একটি ক্যারেক্টার ইনপুট নেয়ার জন্য এবং আউটপুট দেখানোর জন্য ব্যবহার করা হয়। নিচের উদাহরণটা দেখা যাক-

 

#include <iostream>
using namespace std;
main()
{
char c;
cin.get(c);
cout.put(c);
return 0;
}

 

এই প্রোগ্রামটির কাজ হচ্ছে- user এর কাছ থেকে একটি ক্যারেক্টার ইনপুট নেয়া এবং তা মনিটরে আউটপুট হিসেবে দেখানো। তবে আমরা চাইলে get() এবং put() function দুটো ব্যবহার করে টেক্সট এর একটি লাইন এর ইনপুট নিয়ে তার আউটপুট দেখাতে পারি। নিচের উদাহরণটা দেখা যাক-

 

#include <iostream>
using namespace std;
main()
{
int count = 0;
char c;
cout << “Input Text : “;
cin.get(c);

while(c != ‘\\n’)
{
cout.put(c);
count++; //counting the number of characters (including space)
cin.get(c);
}

cout << endl <<“Number of characters = ” << count << endl;

return 0;
}

 

এই কোডটিকে কম্পাইলার দিয়ে রান করলে মনিটরে Input Text : লেখাটা দেখা যাবে এবং কম্পাইলার ব্যবহারকারীর কাছ থেকে ইনপুট পাওয়ার জন্য অপেক্ষায় থাকবে। while loop এর কন্ডিশন যতক্ষণ সত্য থাকবে, অর্থাৎ ব্যবহারকারী যতক্ষণ পর্যন্ত না Enter প্রেস করবে ততক্ষণ পর্যন্ত প্রোগ্রামটি একটি একটি করে ক্যারেক্টার ইনপুট নিতে থাকবে এবং Enter কী প্রেস করার পর, অর্থাৎ লুপটি ভেঙে যাওয়ার পর ইনপুট নেয়া ক্যারেক্টারগুলো আউটপুট হিসেবে মনিটরে দেখা যাবে।

 

প্রোগ্রামের ইনপুট হিসাবে Object Oriented Programming লিখে Enter কী প্রেস করলে আউটপুট হিসেবে নিচের লেখাটা দেখা যাবে-

 

Object Oriented Programming
Number of characters = 27

 

তবে এই কাজটি আমরা আরো সহজে করতে পারি cin অবজেক্টের সাথে getline ফাংশনটি ব্যবহার করে। নিচের প্রোগ্রামটা দেখা যাক-

 

#include <iostream>
using namespace std;
main()
{
char line[30];
cout << “Enter a line of text : “;
cin.getline(line, 10);
cout << endl <<“You entered : ” << line << endl;
cout << “No. of characters : ” << cin.gcount() << endl;
return 0;
}

 

এই কোডটি কম্পাইল করে রান করা হলে মনিটরে Enter a line of text : লেখাটা দেখা যাবে এবং কম্পাইলার ব্যবহারকারীর কাছ থেকে ইনপুট পাওয়ার জন্য অপেক্ষা করবে। ইনপুট হিসেবে যদি Object Oriented Programming লিখে Enter প্রেস করা হয়, তাহলে প্রোগ্রামটির আউটপুট হবে-

 

You entered : Object Or
No. of characters : 9

 

এখন প্রশ্ন হচ্ছে, কোডটি কীভাবে কাজ করল। প্রথমে char line[30]; স্টেটমেন্টটির দ্বারা একটি char টাইপের array ডিক্লেয়ার করা হয়েছে। এই array টি কে আমরা string variable হিসেবে ব্যবহার করবো। এই ভেরিয়েবলটিতে NULL() character সহ সর্বোচ্চ 30 টি ক্যারেক্টার রাখা যাবে। এর পরবর্তী লাইনে টেক্সট এর একটি লাইন ইনপুট নেওয়ার জন্য cin.getline(line, 10); ফাংশনটি ব্যবহার হয়েছে। এই getline ফাংশন এর প্রোটোটাইপ হচ্ছে- getline (variable_name, size_of_array, delim = ‘\\n’)

getline ফাংশন এ প্রথমে ভেরিয়েবলটির (char টাইপের array) নাম লেখা হয় এবং এরপর কমা দিয়ে ইনপুট হিসেবে NULL সহ সর্বোচ্চ কতগুলো ক্যারেক্টার রাখবে সেই সংখ্যাটি উল্লেখ করে দিতে হয়। delim এর জন্য default হিসেবে ‘\\n’ নির্ধারণ করা আছে। delim এর কাজ হচ্ছে- কোন ক্যারেক্টারটা না পাওয়া পর্যন্ত ইনপুট নিতে থাকবে সেটা কম্পাইলারকে জানিয়ে দেওয়া। এক্ষেত্রে delim এর default মান ‘\\n’ নির্ধারিত থাকার কারণে enter প্রেস না করা পর্যন্ত প্রোগ্রামটি ইনপুট নিতে থাকবে এবং নির্ধারিত সর্বোচ্চ সাইজ পর্যন্ত ক্যারেক্টারগুলোকে ভেরিয়েবলে সংরক্ষণ করবে। যেহেতু default হিসেবে delim এর মান ‘\\n’ দেয়া আছে, তাই cin.getline(line, 10); এই স্টেটমেন্টটিতে ‘\\n’ লেখা হয়নি। তবে আমরা চাইলে এই লাইনটিকে cin.getline(line, 10, ‘\\n’); এভাবেও লিখতে পারতাম। এতে কোন সমস্যা নেই। আবার আমরা চাইলে ‘\\n’ এর পরিবর্তে অন্য কোন ক্যারেক্টার ও ব্যবহার করতে পারতাম। ধরা যাক, আমরা ‘q’ ক্যারেক্টার পাওয়ার পূর্ব পর্যন্ত অক্ষরগুলো ভেরিয়েবলে সংরক্ষণ করব। এখন, আমরা যদি cin.getline(line, 10, ‘q’); স্টেটমেন্টটা লিখি , সেক্ষেত্রে কম্পাইলার ‘q’ ক্যারেক্টার ইনপুট দেওয়ার পূর্ব পর্যন্ত অক্ষরগুলো ভেরিয়েবলে সংরক্ষিত করবে এবং পরবর্তীতে আউটপুট দেখতে চাইলে ‘q’ ক্যারেক্টার এর পূর্বে যতগুলো ক্যারেক্টার ইনপুট হিসেবে দেওয়া হয়েছে সেগুলোকে আউটপুট হিসেবে দেখাবে।

 

যদিও উপরের কোডটিতে char line[30]; স্টেটমেন্টটি দ্বারা NULL সহ সর্বোচ্চ 30 টি ক্যারেক্টার line ভেরিয়েবলটিতে রাখা যাবে বলা হচ্ছে, কিন্তু পরবর্তীতে cin.getline(line, 10); স্টেটমেন্ট দ্বারা এর সাইজ 10 নির্ধারণ করে দেওয়ার কারণে কম্পাইলার NULL সহ সর্বোচ্চ 10 টি ক্যারেক্টার এতে রাখবে। এজন্যই প্রোগ্রামের আউটপুট হিসেবে You entered : Object Or এবং No. of characters : 9 দেখা যাচ্ছে। NULL ক্যারেক্টারটা কম্পাইলার অটোমেটিক্যালি দিয়ে দেয়, তাই ক্যারেক্টার এর সংখ্যা 9 দেখা যাচ্ছে।

 

এছাড়াও উপরের প্রোগ্রামে gcount() নামের যে মেম্বার ফাংশনটা ব্যবহার করা হয়েছে তার কাজ হচ্ছে- শেষবার ইনপুট stream থেকে কত বাইট extract করা হয়েছে তা বের করা। কোডটি রান করার পর এই ফাংশন এর কাজটা বুঝতে সমস্যা হবে না আশা করছি।

 

প্রাথমিকভাবে প্রোগ্রামিং করার জন্য এই বিষয়গুলোকে মোটামুটিভাবে জানলেই চলবে। তবে cin অবজেক্টের সাথে আরো কিছু মেম্বার ফাংশন ব্যবহার করা যায়, যেগুলো টিউটোরিয়ালের এই অধ্যায়ে আলোচনা করা হলো না। আপাতত এগুলো ব্যবহার করেই প্রোগ্রামিং এর কাজ চালানো সম্ভব। তবে কেউ চাইলে নিজের উদ্দ্যোগে C++ এর উপর লেখা ভালো কোন বই থেকে সেই ফাংশনগুলো সম্পর্কে জেনে নিতে পারেন। এক্ষেত্রে মোঃ কামরুজ্জামান নিটনের লেখা “অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এবং C++” বইটা অথবা, E Balagurusamy এর লেখা “Object Oriented Programming with C++” বই দুটো দেখা যেতে পারে। আমি টিউটোরিয়ালের এই অধ্যায়টি লেখার ক্ষেত্রে মূলত এই দুটি বই থেকেই সহায়তা নিয়েছি। Beginner-দের জন্য এই দুটো বই বেশ উপকারে আসবে আমার বিশ্বাস। নিটনের লেখা এই বইটা বাংলায় লেখা বলে, নতুনদের প্রোগ্রামিং শেখার জন্য এটি বেশ কাজে আসবে। Balagurusamy এর লেখা বইটা ইংরেজীতে লেখা হলেও, এই বইটি-ও যথেষ্ট কাজের বলবো আমি। কেননা, লেখক সহজ ভাষায় প্রোগ্রামিং এর বিভিন্ন টার্ম এতে ব্যাখ্যা করেছেন।

সবাইকে ধন্যবাদ ধৈর্য্য ধরে টিউটোরিয়ালটি পড়ার জন্য। এই টিউটোরিয়াল এর ব্যাপারে আপনাদের গুরুত্বপূর্ণ মন্তব্য আশা করছি।

LEAVE A REPLY

Please enter your comment!
Please enter your name here