C++ এ একটি বাইনারি ফাইল লিখুন

C E Ekati Ba Inari Pha Ila Likhuna



C++ প্রোগ্রামিং-এ, বাইনারি ফাইলগুলির সাথে কাজ করা কাঁচা ডেটা সংরক্ষণ এবং ম্যানিপুলেট করার জন্য মৌলিক। আপনি ছবি, অডিও ফাইল বা কাস্টম ডেটা স্ট্রাকচার নিয়ে কাজ করছেন না কেন, বাইনারি ফাইলগুলিকে দক্ষতার সাথে লেখার ক্ষমতা অত্যন্ত গুরুত্বপূর্ণ। বাইনারি ফাইলগুলি এমন একটি বিন্যাসে ডেটা সঞ্চয় করে যা মানব-পঠনযোগ্য নয়, এগুলিকে বিভিন্ন অ্যাপ্লিকেশনের জন্য উপযুক্ত করে তোলে যেমন জটিল কাঠামো, চিত্র, বা যে কোনও ডেটা যা একটি সাধারণ পাঠ্য-ভিত্তিক উপস্থাপনা অনুসরণ করে না।

C++ বাইনারি ডেটা লেখার জন্য বাইনারি ফাইল, বিশেষ করে 'অফস্ট্রিম' ক্লাসের সাথে ইন্টারঅ্যাক্ট করার জন্য লাইব্রেরি প্রদান করে। এই ক্ষমতা ডেভেলপারদের নির্বিঘ্নে বাইনারি ফাইল তৈরি, পরিবর্তন এবং পরিচালনা করতে দেয়। এই নিবন্ধটি C++ এ বাইনারি ফাইলগুলি লেখার জন্য বিভিন্ন পদ্ধতি এবং কৌশলগুলি অন্বেষণ করে, তাদের অ্যাপ্লিকেশন এবং ব্যবহারের ক্ষেত্রে আলোকপাত করে।

C++ ব্যবহার করে একটি বাইনারি ফাইল লিখুন

C++ ব্যবহার করে একটি বাইনারি ফাইলে ডেটা সংরক্ষণ করতে, write() পদ্ধতি ব্যবহার করা হয়। এই ফাংশনটি 'পুট' পয়েন্টারের অবস্থান থেকে শুরু করে নির্ধারিত স্ট্রীমে একটি নির্দিষ্ট সংখ্যক বাইট লেখে। যদি 'পুট' পয়েন্টার শেষে থাকে, ফাইলটি প্রসারিত হয়। যাইহোক, পয়েন্টার ফাইলের মধ্যে থাকলে নতুন ডেটা বিদ্যমান অক্ষরগুলিকে ওভাররাইট করে। লেখার প্রক্রিয়া চলাকালীন একটি ত্রুটি ঘটলে, স্ট্রিমটি একটি ত্রুটির অবস্থায় হিসাবে চিহ্নিত করা হয়। এখন, কিছু সাধারণ এবং বিল্ট ইন C++ ফাংশন ব্যবহার করে বাইনারি ফাইলে কীভাবে লিখতে হয় তা শিখতে উদাহরণগুলিতে এগিয়ে যাওয়া যাক।







পদ্ধতি 1: স্ট্রাকচার্ড ডেটা দিয়ে বাইনারি ফাইল লেখা

অনেক ক্ষেত্রে আপনাকে বাইনারি ফাইলে কাস্টম স্ট্রাকচারের মতো স্ট্রাকচার্ড ডেটা লিখতে হতে পারে। আসুন এমন একটি উদাহরণ বিবেচনা করি যেখানে একজন ব্যক্তির রেকর্ড রয়েছে যার মধ্যে একজন ব্যক্তির নাম, উচ্চতা এবং বয়স অন্তর্ভুক্ত রয়েছে। নিম্নলিখিত প্রদত্ত কোডটি দেখুন এবং ব্যাখ্যাটি দেখুন:



# অন্তর্ভুক্ত করুন

# অন্তর্ভুক্ত করুন

গঠন ব্যক্তি {

চর নাম [ পঞ্চাশ ] ;

int বয়স ;

দ্বিগুণ উচ্চতা ;

} ;

int প্রধান ( ) {

std :: অফস্ট্রিম আউটফাইল ( 'people.bin' , std :: আইওএস :: বাইনারি ) ;

যদি ( ! আউটফাইল খোলা ( ) ) {

std :: সের << 'ত্রুটি! লেখার জন্য ফাইল খুলতে পারছি না!' << std :: endl ;

ফিরে 1 ;

}

ব্যক্তি ব্যক্তি1 = { 'কলসুম ইলিয়াস' , 25 , 1.75 } ;

ব্যক্তি ব্যক্তি2 = { 'কালসুম বাজওয়া' , 30 , 1.68 } ;

আউটফাইল লিখুন ( reinterpret_cast < চর *> ( এবং ব্যক্তি 1 ) , আকার ( ব্যক্তি 1 ) ) ;

আউটফাইল লিখুন ( reinterpret_cast < চর *> ( এবং ব্যক্তি2 ) , আকার ( ব্যক্তি2 ) ) ;

আউটফাইল বন্ধ ( ) ;

std :: cout << 'ব্যক্তির রেকর্ড সফলভাবে বাইনারি ফাইলে লেখা হয়েছে।' << std :: endl ;

ফিরে 0 ;

}

এখানে নির্দিষ্ট বিবরণ সহ কোডের একটি ব্রেকডাউন রয়েছে। প্রোগ্রামটি 'ব্যক্তি' নামে একটি কাস্টম কাঠামো সংজ্ঞায়িত করে শুরু হয়। এটির তিনটি ক্ষেত্র রয়েছে: নাম, বয়স এবং উচ্চতা। এই ক্ষেত্রগুলির বিবরণ নিম্নরূপ:



  • নাম: ব্যক্তির নাম সংরক্ষণ করার জন্য একটি স্ট্রিং (50টি অক্ষর পর্যন্ত)
  • বয়স: ব্যক্তির বয়স সংরক্ষণ করার জন্য একটি পূর্ণসংখ্যা
  • উচ্চতা: ব্যক্তির উচ্চতা সংরক্ষণ করার জন্য একটি দ্বিগুণ

'ব্যক্তি' কাঠামো সংজ্ঞায়িত করার পরে, মূল ফাংশনটি শুরু হয় যা প্রোগ্রামের এন্ট্রি পয়েন্ট। প্রধান প্রোগ্রামের প্রথম লাইনটি 'people.bin' নামে একটি ফাইল খোলে। বাইনারি ফরম্যাটে ডেটা লেখার জন্য আমরা 'people.bin' নামে একটি ফাইল তৈরি করতে 'std::ofstream' ব্যবহার করি। ফাইলটি সফলভাবে খোলে কিনা তা পরীক্ষা করা খুবই গুরুত্বপূর্ণ। অন্যথায়, একটি ত্রুটি বার্তা দেখানো হয় এবং প্রোগ্রামটি বন্ধ হয়ে যায়। তাই, “if” কন্ডিশন এবং is_open() ফাংশনের সাহায্যে আমরা পরীক্ষা করি যে ফাইলটি সফলভাবে ওপেন হয়েছে কি না।





এখানে, দুটি 'ব্যক্তি' বস্তু তৈরি করা হয়েছে। আমরা 'ব্যক্তি' টাইপের দুটি ভেরিয়েবল, 'person1' এবং 'person2' সংজ্ঞায়িত করি। আমরা 'কলসুম ইলিয়াস' এবং 'কালসুম বাজওয়া' এর জন্য পরিবর্তনশীল নাম, বয়স এবং উচ্চতার মান নির্ধারণ করি।

এখন যেহেতু আমাদের কাছে বাইনারি ফাইলে লেখার জন্য ডেটা আছে, আসুন write() ফাংশন দিয়ে প্রকৃত ফাংশনটি সম্পাদন করি। ফাইলে প্রতিটি 'ব্যক্তি' অবজেক্টের বিষয়বস্তু লিখতে আমরা 'outFile.write' ব্যবহার করি। 'রিইন্টারপ্রেট_কাস্ট(&person1)' এবং 'reinterpret_cast(&person2)' সম্পূর্ণ 'ব্যক্তি' কাঠামোকে (এর সমস্ত ক্ষেত্র সহ) বাইটের একটি অবিচ্ছিন্ন স্ট্রীমে রূপান্তর করে যা বাইনারি ফাইলে লেখার জন্য উপযুক্ত। . সমস্ত ডেটা সঠিকভাবে লেখা হয়েছে কিনা তা নিশ্চিত করতে আমরা 'sizeof(person1)' এবং 'sizeof(person2)' ব্যবহার করে প্রতিটি 'ব্যক্তি' বস্তুর আকার লিখি।



ফাইলে ডেটা লেখার পরে, এটি সঠিকভাবে বন্ধ করা খুব গুরুত্বপূর্ণ যাতে অন্য কোনও ফাংশনের কারণে কোনও ডেটা নষ্ট না হয়। আমরা outFile.close() ব্যবহার করি ফাইলের সাথে যুক্ত রিসোর্স রিলিজ করতে এবং ডেটা সঠিকভাবে লেখা হয়েছে তা নিশ্চিত করতে। অবশেষে, আমরা একটি বার্তা প্রিন্ট করি যা বাইনারি ফাইলে ডেটার সফল লেখা নিশ্চিত করে।

যদি আমরা এই উদাহরণটিকে আরও সহজ ভাষায় ব্যাখ্যা করি, তাহলে একটি বিশেষ নোটবুক কল্পনা করুন যা শুধুমাত্র একটি গোপন ভাষায় লোকেদের সম্পর্কে তথ্য সংরক্ষণ করতে পারে। এই কোড তথ্য (নাম, বয়স, উচ্চতা) সংগঠিত করার জন্য একটি ব্লুপ্রিন্ট তৈরি করে। এটি নোটবুকটি খোলে, দু'জনের প্রোফাইলগুলি পূরণ করে, গোপন ভাষায় তথ্য অনুবাদ করে এবং ভিতরে সুন্দরভাবে লিখে। তারপরে এটি নোটবুকটিকে নিরাপদে বন্ধ করে দেয়, ভবিষ্যতে ব্যবহারের জন্য প্রোফাইলগুলি সংরক্ষণ করে। নিম্নলিখিত স্ন্যাপশটে দেওয়া প্রোগ্রামটির আউটপুট পড়ুন:

পদ্ধতি 2: একটি বাইনারি ফাইলে পূর্ণসংখ্যা লেখা

এই পদ্ধতিতে, 'integers.bin' নামে একটি বাইনারি ফাইলে পূর্ণসংখ্যার একটি অ্যারে লেখা হয়। “reinterpret_cast” ফাইলটিতে লেখার জন্য অক্ষরের (বাইট) ক্রম হিসাবে পূর্ণসংখ্যা অ্যারেকে বিবেচনা করে। এটি বিশেষভাবে গুরুত্বপূর্ণ কারণ বাইনারি ফাইলগুলি কাঁচা বাইট ডেটা নিয়ে কাজ করে। আসুন আমরা নিম্নলিখিত সহজ উদাহরণটি দেখি:

# অন্তর্ভুক্ত করুন

# অন্তর্ভুক্ত করুন

int প্রধান ( ) {

std :: অফস্ট্রিম আউটফাইল ( 'integers.bin' , std :: আইওএস :: বাইনারি ) ;

যদি ( ! আউটফাইল খোলা ( ) ) {

std :: সের << 'ত্রুটি! লেখার জন্য ফাইল খুলতে পারছি না!' << std :: endl ;

ফিরে 1 ;

}

int সংখ্যা [ ] = { 42 , 99 , - 1 , 0 } ;

আউটফাইল লিখুন ( reinterpret_cast < চর *> ( সংখ্যা ) , আকার ( সংখ্যা ) ) ;

আউটফাইল বন্ধ ( ) ;

std :: cout << 'প্রদত্ত পূর্ণসংখ্যাগুলি সফলভাবে বাইনারি ফাইলে লেখা হয়েছে।' << std :: endl ;

ফিরে 0 ;

}

এখানে নির্দিষ্ট বিবরণ সহ কোডের একটি ব্রেকডাউন রয়েছে:

'#include ' এবং '#include ' ফাইলগুলির সাথে কাজ করার জন্য এবং যথাক্রমে cin এবং write() এর মতো বার্তাগুলি প্রিন্ট করার জন্য প্রয়োজনীয় সরঞ্জামগুলি নিয়ে আসে৷ 'std::ofstream outFile('integers.bin', std::ios::binary);' 'integers.bin' নামে একটি বাইনারি ফাইল খোলে যা শুধুমাত্র একটি গোপন কোডে (বাইনারী বিন্যাস) সংখ্যা সংরক্ষণ করতে পারে। ফাইলটি খোলা আছে কিনা তা পরীক্ষা করে। অন্যথায়, একটি ত্রুটি বার্তা দেওয়া হয়.

পরবর্তী লাইন যা “int numbers[] = {42, 99, -1, 0};” পূর্ণসংখ্যা 42, 99, -1, এবং 0 সহ 'সংখ্যা' নামের একটি অ্যারেকে সংজ্ঞায়িত করে। 'outFile.write(reinterpret_cast(numbers), sizeof(numbers));' সাবধানে পূর্ণসংখ্যাগুলিকে বাইনারি বিন্যাসে অনুবাদ করে এবং সেগুলিকে “integer.bin” ফাইলে লেখে। 'outFile.close();' পূর্ণসংখ্যাগুলিকে নিরাপদ এবং সংগঠিত রাখতে সঠিকভাবে ফাইলটি বন্ধ করে। অবশেষে, বাইনারি ফাইলে পূর্ণসংখ্যা সফলভাবে সংরক্ষণ করা হয়েছে তা নিশ্চিত করতে একটি বার্তা প্রিন্ট করা হয়। ফলাফল দেখতে এই প্রোগ্রামের নিম্নলিখিত আউটপুট পড়ুন:

উপসংহার

C++ এ বাইনারি ফাইল লেখা বিভিন্ন ধরনের ডেটা দক্ষতার সাথে পরিচালনা করার জন্য একটি গুরুত্বপূর্ণ দক্ষতা। C++ এ বাইনারি ফাইল লেখার এই অন্বেষণে, আমরা শিখেছি কিভাবে 'অফস্ট্রিম' ক্লাসটি বাইনারি ডেটা দক্ষতার সাথে পরিচালনা করতে নিযুক্ত করা যেতে পারে। কাস্টম স্ট্রাকচার ব্যবহার করে সাধারণ পূর্ণসংখ্যা বা স্ট্রাকচার্ড ডেটা নিয়ে কাজ করা হোক না কেন, প্রক্রিয়াটির মধ্যে একটি ফাইল স্ট্রিম খোলা, বাইনারি বিন্যাসে ডেটা লেখা এবং তারপর ফাইলটি বন্ধ করা জড়িত। এই ক্ষমতা C++ ডেভেলপারদের বিভিন্ন ধরনের বাইনারি ডাটা টাইপের সাথে কাজ করার নমনীয়তা প্রদান করে, যা সিস্টেম-লেভেল প্রোগ্রামিং থেকে মাল্টিমিডিয়া প্রসেসিং পর্যন্ত অ্যাপ্লিকেশনে ভাষার বহুমুখীতায় অবদান রাখে।