C++ তে ফাইল হ্যান্ডলিং (File Handling) হলো প্রোগ্রামিংয়ের এমন একটি অংশ, যা ফাইল সিস্টেমের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহৃত হয়। এটি ব্যবহারকারীদের ফাইল থেকে ডেটা পড়তে এবং ফাইলে ডেটা লিখতে সক্ষম করে। C++ এ ফাইল হ্যান্ডলিংয়ের জন্য <fstream> লাইব্রেরি ব্যবহার করা হয়, যার মধ্যে std::ifstream, std::ofstream, এবং std::fstream ক্লাসগুলো অন্তর্ভুক্ত রয়েছে।
C++ তে ফাইল হ্যান্ডলিং সাধারণত তিনটি প্রধান কাজের জন্য ব্যবহৃত হয়:
- পড়া (Reading)
- লেখা (Writing)
- ফাইলের সাথে সংশ্লিষ্ট অন্যান্য অপারেশন (File Manipulation)
ফাইল হ্যান্ডলিংয়ের জন্য প্রধান ক্লাস:
std::ifstream(Input File Stream): এটি ফাইল থেকে ডেটা পড়তে ব্যবহৃত হয়।std::ofstream(Output File Stream): এটি ফাইলে ডেটা লিখতে ব্যবহৃত হয়।std::fstream(File Stream): এটি ফাইল থেকে পড়া এবং ফাইলে লেখা উভয়ের জন্য ব্যবহৃত হয়।
১. ফাইল থেকে ডেটা পড়া (Reading from a File)
ফাইল থেকে ডেটা পড়ার জন্য std::ifstream ক্লাস ব্যবহার করা হয়। এটি একটি ইনপুট স্ট্রিম তৈরি করে এবং ফাইলের ডেটা পড়তে সাহায্য করে।
উদাহরণ (Reading from a File):
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream inputFile("example.txt"); // ফাইল ওপেন করা
if (!inputFile) { // ফাইল খোলার পর যদি ত্রুটি ঘটে
std::cerr << "Error opening file." << std::endl;
return 1;
}
std::string line;
// ফাইলের প্রতিটি লাইন পড়া
while (getline(inputFile, line)) {
std::cout << line << std::endl; // ফাইলের লাইনটি আউটপুট করা
}
inputFile.close(); // ফাইল বন্ধ করা
return 0;
}ব্যাখ্যা:
std::ifstream inputFile("example.txt");:example.txtনামক ফাইলটি পড়ার জন্য ওপেন করা হয়েছে।getline(inputFile, line): ফাইল থেকে লাইন আকারে ডেটা পড়া হচ্ছে।inputFile.close(): ফাইল বন্ধ করার জন্য ব্যবহৃত হয়।
২. ফাইলে ডেটা লেখা (Writing to a File)
ফাইলে ডেটা লিখতে std::ofstream ক্লাস ব্যবহার করা হয়। এটি একটি আউটপুট স্ট্রিম তৈরি করে এবং ফাইলে ডেটা লিখতে সাহায্য করে।
উদাহরণ (Writing to a File):
#include <iostream>
#include <fstream>
int main() {
std::ofstream outputFile("output.txt"); // ফাইল ওপেন করা
if (!outputFile) { // ফাইল খোলার পর যদি ত্রুটি ঘটে
std::cerr << "Error opening file." << std::endl;
return 1;
}
// ফাইলে লেখা
outputFile << "Hello, this is a test." << std::endl;
outputFile << "Writing to a file in C++ is easy!" << std::endl;
outputFile.close(); // ফাইল বন্ধ করা
return 0;
}ব্যাখ্যা:
std::ofstream outputFile("output.txt");:output.txtনামক ফাইলটি লেখার জন্য ওপেন করা হয়েছে।outputFile << "text": ফাইলে লেখা হচ্ছে।outputFile.close(): ফাইল বন্ধ করা হচ্ছে।
৩. ফাইল থেকে পড়া এবং ফাইলে লেখা (Reading and Writing to a File)
ফাইল থেকে পড়া এবং ফাইলে লেখা একসাথে করতে std::fstream ব্যবহার করা হয়।
উদাহরণ (Reading and Writing with std::fstream):
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::fstream file("example.txt", std::ios::in | std::ios::out); // ফাইল ওপেন করা
if (!file) { // ফাইল খোলার পর যদি ত্রুটি ঘটে
std::cerr << "Error opening file." << std::endl;
return 1;
}
std::string line;
// ফাইল থেকে পড়া
while (getline(file, line)) {
std::cout << line << std::endl; // ফাইলের লাইন আউটপুট করা
}
// ফাইলে লেখা
file.clear(); // EOF ফ্ল্যাগ মুছে দেওয়া
file.seekp(0, std::ios::end); // ফাইলের শেষে লেখা শুরু করা
file << "New line added to the file." << std::endl;
file.close(); // ফাইল বন্ধ করা
return 0;
}ব্যাখ্যা:
std::fstream file("example.txt", std::ios::in | std::ios::out);: এটি ফাইলটি পড়া এবং লেখার জন্য ওপেন করে।file.seekp(0, std::ios::end);: এটি ফাইলের শেষে লেখার জন্য কার্সর নিয়ে আসে।
৪. ফাইল অবস্থার চেক করা (Checking File Status)
ফাইলের অবস্থা চেক করতে fail(), eof() এবং good() ফাংশনগুলি ব্যবহার করা হয়।
উদাহরণ (Checking File Status):
#include <iostream>
#include <fstream>
int main() {
std::ifstream inputFile("example.txt");
// ফাইল চেক করা
if (inputFile.fail()) {
std::cerr << "Failed to open the file." << std::endl;
return 1;
}
std::cout << "File opened successfully." << std::endl;
// EOF চেক করা
if (inputFile.eof()) {
std::cout << "End of file reached." << std::endl;
}
inputFile.close();
return 0;
}ব্যাখ্যা:
fail(): যদি ফাইল ওপেন বা পড়তে সমস্যা হয়, তবে এটিtrueরিটার্ন করে।eof(): যদি ফাইলের শেষে পৌঁছে যায়, তবে এটিtrueরিটার্ন করে।
৫. বাইনারি ফাইল হ্যান্ডলিং (Binary File Handling)
C++ তে বাইনারি ফাইল হ্যান্ডলিং করার জন্য std::ios::binary মোড ব্যবহার করা হয়। বাইনারি ফাইলগুলোতে ডেটা সরাসরি বাইট হিসেবে লেখা হয়, যেমন ছবি বা অডিও ফাইল।
উদাহরণ (Binary File Handling):
#include <iostream>
#include <fstream>
int main() {
std::ofstream outputFile("example.bin", std::ios::binary);
int num = 12345;
outputFile.write(reinterpret_cast<char*>(&num), sizeof(num)); // বাইনারি ফাইল লেখা
outputFile.close();
// বাইনারি ফাইল থেকে ডেটা পড়া
std::ifstream inputFile("example.bin", std::ios::binary);
int readNum;
inputFile.read(reinterpret_cast<char*>(&readNum), sizeof(readNum)); // বাইনারি ফাইল পড়া
std::cout << "Read number: " << readNum << std::endl;
inputFile.close();
return 0;
}ব্যাখ্যা:
std::ios::binary: এটি ফাইলটি বাইনারি মোডে ওপেন করে, যাতে ডেটা বাইনারি ফর্ম্যাটে পড়া এবং লেখা হয়।reinterpret_cast<char*>: এটি এক ধরনের টাইপ কাস্টিং যা পয়েন্টারটি একটিcharপয়েন্টারে রূপান্তরিত করে, যাতে ডেটা বাইনারি ফর্ম্যাটে লেখা যায়।
উপসংহার
C++ তে ফাইল হ্যান্ডলিং একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা ফাইল সিস্টেমের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহৃত হয়। <fstream> লাইব্রেরি ফাইলের সাথে কাজ করতে সহায়ক ক্লাস সরবরাহ করে, যেমন std::ifstream, std::ofstream, এবং **std::fstream**। এই ক্লাসগুলির মাধ্যমে আপনি ফাইল থেকে ডেটা পড়তে, ফাইলে ডেটা লিখতে এবং বাইনারি ফাইলসহ অন্যান্য ফাইল ম্যানিপুলেশন করতে পারেন। C++ তে ফাইল হ্যান্ডলিং সহজ এবং শক্তিশালী, যা আপনাকে আপনার প্রোগ্রামের জন্য ফাইল প্রক্রিয়াজাতকরণ নিশ্চিত করতে সাহায্য করে।
File Handling C++ প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ দিক, যা প্রোগ্রামারদের ফাইল থেকে ডেটা পড়া, ফাইলে ডেটা লেখা এবং ফাইলে ডেটা সংশোধন করতে সহায়তা করে। C++ স্ট্যান্ডার্ড লাইব্রেরিতে ফাইল হ্যান্ডলিংয়ের জন্য std::fstream ক্লাস সরবরাহ করা হয়েছে, যা ifstream (ইনপুট ফাইল স্ট্রিম), ofstream (আউটপুট ফাইল স্ট্রিম), এবং fstream (দ্বিমুখী ফাইল স্ট্রিম) অন্তর্ভুক্ত করে।
File Handling এর জন্য std::fstream এর ব্যবহার
C++ এ std::fstream এর মাধ্যমে প্রোগ্রাম থেকে ফাইল পড়া এবং ফাইলে লেখা করা যায়। std::fstream ফাইল হ্যান্ডলিংয়ের জন্য একটি বহুমুখী ক্লাস, যা ইনপুট ও আউটপুট উভয় কাজ করতে পারে।
প্রধান স্ট্রিম ক্লাসসমূহ
- std::ifstream: ফাইল থেকে পড়ার জন্য ব্যবহৃত হয়।
- std::ofstream: ফাইলে লেখার জন্য ব্যবহৃত হয়।
- std::fstream: ফাইল থেকে পড়া এবং ফাইলে লেখার জন্য ব্যবহৃত হয়।
১. ফাইলে লেখা (Writing to a File) - std::ofstream
std::ofstream ফাইলের সাথে সংযোগ স্থাপন করে এবং ফাইলে ডেটা লেখার জন্য ব্যবহৃত হয়। ফাইলটি যদি না থাকে, তবে এটি নতুন একটি ফাইল তৈরি করে।
উদাহরণ:
#include <iostream>
#include <fstream> // ofstream অন্তর্ভুক্ত করার জন্য
int main() {
std::ofstream file("example.txt"); // ফাইল খোলা
if (file.is_open()) { // ফাইলটি সফলভাবে খুললে
file << "Hello, File Handling!\n";
file << "Writing data to a file.\n";
file.close(); // ফাইল বন্ধ করা
std::cout << "Data written to file successfully." << std::endl;
} else {
std::cout << "Failed to open file." << std::endl;
}
return 0;
}আউটপুট:
Data written to file successfully.ফাইল example.txt এ নিচের মত ডেটা লেখা থাকবে:
Hello, File Handling!
Writing data to a file.২. ফাইল থেকে পড়া (Reading from a File) - std::ifstream
std::ifstream ফাইল থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়। ফাইলটি যদি না থাকে, তবে এটি খোলার প্রচেষ্টা ব্যর্থ হয়।
উদাহরণ:
#include <iostream>
#include <fstream> // ifstream অন্তর্ভুক্ত করার জন্য
#include <string>
int main() {
std::ifstream file("example.txt"); // ফাইল খোলা
if (file.is_open()) { // ফাইলটি সফলভাবে খুললে
std::string line;
while (getline(file, line)) { // ফাইল থেকে লাইন বাই লাইন পড়া
std::cout << line << std::endl;
}
file.close(); // ফাইল বন্ধ করা
} else {
std::cout << "Failed to open file." << std::endl;
}
return 0;
}উপরে example.txt ফাইল থেকে প্রতিটি লাইন পড়া হয়েছে এবং কনসোলে প্রদর্শিত হয়েছে।
৩. ফাইলে পড়া ও লেখা (Reading and Writing) - std::fstream
std::fstream ক্লাসটি ইনপুট এবং আউটপুট উভয় কাজ করতে সক্ষম, অর্থাৎ এটি একই সাথে ফাইলে ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়। এটি ফাইল খুলতে std::ios::in এবং std::ios::out মোডে ব্যবহার করা হয়।
উদাহরণ:
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::fstream file("example.txt", std::ios::in | std::ios::out | std::ios::app); // ফাইল পড়া ও লেখার মোডে খোলা
if (file.is_open()) {
// ফাইলে লেখা
file << "Appending more data.\n";
// ফাইলের শুরুতে ফিরে যাওয়া
file.seekg(0);
// ফাইল থেকে পড়া
std::string line;
while (getline(file, line)) {
std::cout << line << std::endl;
}
file.close(); // ফাইল বন্ধ করা
} else {
std::cout << "Failed to open file." << std::endl;
}
return 0;
}এখানে example.txt ফাইলে নতুন ডেটা যোগ করা হয়েছে এবং এর সব ডেটা কনসোলে প্রিন্ট করা হয়েছে।
ফাইল মোডের প্রধান বৈশিষ্ট্য
| মোড | বর্ণনা |
|---|---|
std::ios::in | ফাইল থেকে পড়ার জন্য ব্যবহার করা হয়। |
std::ios::out | ফাইলে লেখার জন্য ব্যবহার করা হয়। |
std::ios::app | ফাইলে শেষে নতুন ডেটা যোগ করার জন্য ব্যবহৃত হয়। |
std::ios::trunc | ফাইলের পুরানো ডেটা মুছে ফেলে নতুন ডেটা যোগ করে। |
std::ios::ate | ফাইল খুললে কার্সর শেষ অবস্থানে চলে যায়। |
std::ios::binary | বাইনারি মোডে ফাইল খুলতে ব্যবহৃত হয়। |
ফাইল স্ট্রিম চেক করার ফাংশন
is_open(): চেক করে যে ফাইলটি সফলভাবে খোলা হয়েছে কিনা।eof(): ফাইলের শেষ পর্যন্ত পৌঁছানোর জন্য ব্যবহৃত হয়। এটিtrueরিটার্ন করে যদি ফাইলের শেষে পৌঁছে যায়।fail(): ফাইল অপারেশন ব্যর্থ হলেtrueরিটার্ন করে।
উদাহরণ:
#include <iostream>
#include <fstream>
int main() {
std::ifstream file("example.txt");
if (!file) {
std::cerr << "Error: Could not open file." << std::endl;
return 1;
}
while (!file.eof()) {
std::string line;
getline(file, line);
std::cout << line << std::endl;
}
file.close();
return 0;
}সংক্ষেপে
std::fstream এবং এর সাথে সম্পর্কিত std::ifstream ও std::ofstream ক্লাসের মাধ্যমে C++ এ ফাইল হ্যান্ডলিং খুবই সহজ। এর মাধ্যমে ফাইল থেকে পড়া, ফাইলে লেখা, এবং ফাইল সংশোধন করা যায়। এই ক্লাসগুলোর সাহায্যে ফাইলের ইনপুট এবং আউটপুট অপারেশন কার্যকরভাবে পরিচালনা করা যায়, যা বড় ডেটা বা ফাইল ম্যানেজমেন্টের ক্ষেত্রে অত্যন্ত কার্যকর।
C++ এ binary এবং text ফাইলের সাথে কাজ করার জন্য বিভিন্ন ফাংশন এবং লাইব্রেরি সরঞ্জাম সরবরাহ করা হয়েছে। Text files সাধারণত পাঠযোগ্য ফাইল হয় যেখানে ডেটা মানুষের জন্য পড়তে সক্ষম হয় (যেমন .txt, .csv ইত্যাদি), আর Binary files সেগুলো যেখানে ডেটা সরাসরি বাইনারি ফর্ম্যাটে সঞ্চিত থাকে এবং সেগুলো মানুষের কাছে পাঠযোগ্য নয় (যেমন ইমেজ, অডিও, অথবা অন্যান্য ফাইল ফরম্যাটে)।
C++ এ ফাইল রিডিং, রাইটিং, এবং ম্যানিপুলেশনের জন্য <fstream> লাইব্রেরি ব্যবহৃত হয়, যা std::ifstream, std::ofstream, এবং std::fstream ক্লাস প্রদান করে। নিচে text files এবং binary files এর সাথে কাজ করার কিছু উদাহরণ দেওয়া হলো।
১. Text File এর সাথে কাজ করা
Text files এর সাথে কাজ করতে std::ifstream (input file stream) এবং std::ofstream (output file stream) ক্লাস ব্যবহার করা হয়। এগুলো ফাইল থেকে ডেটা পড়া এবং ফাইলে ডেটা লেখা সহজ করে।
উদাহরণ: Text File এ লেখা
#include <iostream>
#include <fstream>
#include <string>
int main() {
// ফাইল তৈরি বা খোলা
std::ofstream outFile("example.txt");
if (outFile.is_open()) {
// ফাইলে লেখা
outFile << "Hello, World!" << std::endl;
outFile << "This is a text file example." << std::endl;
outFile.close(); // ফাইল বন্ধ
std::cout << "Data written to file successfully." << std::endl;
} else {
std::cout << "Unable to open file for writing." << std::endl;
}
return 0;
}আউটপুট:
Data written to file successfully.এখানে, "example.txt" ফাইলে "Hello, World!" এবং "This is a text file example." লেখা হয়েছে।
উদাহরণ: Text File থেকে পড়া
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream inFile("example.txt");
if (inFile.is_open()) {
std::string line;
while (getline(inFile, line)) {
std::cout << line << std::endl; // ফাইলের প্রতিটি লাইন প্রিন্ট করা
}
inFile.close(); // ফাইল বন্ধ
} else {
std::cout << "Unable to open file for reading." << std::endl;
}
return 0;
}আউটপুট:
Hello, World!
This is a text file example.এখানে, "example.txt" ফাইল থেকে প্রতিটি লাইন পড়ে স্ক্রীনে প্রদর্শন করা হয়েছে।
২. Binary File এর সাথে কাজ করা
Binary files এর সাথে কাজ করতে std::ifstream এবং std::ofstream এর পাশাপাশি ফাইলের বাইনারি মোডে ওপেন করার জন্য "binary" ফ্ল্যাগ ব্যবহার করা হয়। বাইনারি ফাইলের মধ্যে ডেটা সরাসরি মেমরিতে পড়া বা লেখা হয়।
উদাহরণ: Binary File এ লেখা
#include <iostream>
#include <fstream>
int main() {
int num = 12345;
// বাইনারি মোডে ফাইল খুলুন
std::ofstream outFile("example.bin", std::ios::binary);
if (outFile.is_open()) {
// বাইনারি ফাইলের মধ্যে ডেটা লেখা
outFile.write(reinterpret_cast<char*>(&num), sizeof(num));
outFile.close(); // ফাইল বন্ধ
std::cout << "Data written to binary file successfully." << std::endl;
} else {
std::cout << "Unable to open file for writing." << std::endl;
}
return 0;
}আউটপুট:
Data written to binary file successfully.এখানে, একটি int টাইপের মান num বাইনারি ফরম্যাটে "example.bin" ফাইলে লেখা হয়েছে। reinterpret_cast<char*> ব্যবহার করে আমরা int টাইপের ডেটা কে বাইনারি রূপে কাস্ট করেছি এবং write() ফাংশন ব্যবহার করে তা ফাইলে লিখেছি।
উদাহরণ: Binary File থেকে পড়া
#include <iostream>
#include <fstream>
int main() {
int num;
// বাইনারি মোডে ফাইল খুলুন
std::ifstream inFile("example.bin", std::ios::binary);
if (inFile.is_open()) {
// বাইনারি ফাইল থেকে ডেটা পড়া
inFile.read(reinterpret_cast<char*>(&num), sizeof(num));
inFile.close(); // ফাইল বন্ধ
std::cout << "Read number from binary file: " << num << std::endl;
} else {
std::cout << "Unable to open file for reading." << std::endl;
}
return 0;
}আউটপুট:
Read number from binary file: 12345এখানে, "example.bin" ফাইল থেকে বাইনারি ডেটা পড়ে এটি num ভেরিয়েবলে সংরক্ষিত হয়েছে।
৩. Text এবং Binary File এর মধ্যে পার্থক্য
| ফিচার | Text File | Binary File |
|---|---|---|
| মানুষের জন্য পড়া | পাঠযোগ্য (Readable by humans) | পাঠযোগ্য নয় (Not human-readable) |
| ফরম্যাট | পাঠযোগ্য টেক্সট (Character encoding) | বাইনারি ডেটা (Raw binary data) |
| লেখা এবং পড়া | << এবং >> অপারেটর ব্যবহার | write() এবং read() ফাংশন ব্যবহার |
| প্রতিনিধিত্ব | প্রতিটি চরিত্র একটি আউটপুট ভ্যালু | ডেটা সরাসরি মেমরি অনুযায়ী স্টোর |
| ফাইল সাইজ | সাধারণত ছোট এবং কম্প্যাক্ট | বড় বা আরও কম্প্যাক্ট হতে পারে |
উপসংহার
- Text Files: সাধারণত মানুষের দ্বারা পড়া যায় এবং সাধারণ ফাংশন দিয়ে লেখা এবং পড়া হয়।
std::ofstreamএবংstd::ifstreamব্যবহার করে ফাইলের ভিতরে টেক্সট লিখা এবং পড়া হয়। - Binary Files: বাইনারি ডেটা সরাসরি ফাইলের মধ্যে পড়া এবং লেখা হয়। বাইনারি ফাইলের সাথে কাজ করার জন্য
"binary"ফ্ল্যাগ ব্যবহার করা হয়, এবংwrite()ওread()ফাংশনগুলো ব্যবহার করা হয়।
এই দুটি ফাইল ম্যানিপুলেশন ফাংশন সি++ প্রোগ্রামিংয়ে বিভিন্ন ধরনের ডেটা সঞ্চয় এবং পরিচালনার জন্য অত্যন্ত গুরুত্বপূর্ণ।
Random Access File Operations C++-এ একটি ধরনের ফাইল অপারেশন যা ফাইলের যেকোনো অংশে সরাসরি পৌঁছাতে সাহায্য করে, অর্থাৎ আপনি ফাইলের শুরু থেকে শেষ পর্যন্ত কেবল ধারাবাহিকভাবে পড়ার পরিবর্তে নির্দিষ্ট স্থান থেকে ফাইলের ডেটা পড়তে বা লিখতে পারবেন। এটি ফাইল স্ট্রিমের মাধ্যমে পজিশন পরিবর্তন করে কাজ করে, যার ফলে আপনি ফাইলের যেকোনো অংশে দ্রুত পৌঁছাতে পারেন।
C++-এ random access file operations সাধারণত fstream বা **fstream এর seekg() এবং seekp() ফাংশনগুলি ব্যবহার করে করা হয়। seekg() ইনপুট ফাইলের জন্য এবং seekp() আউটপুট ফাইলের জন্য ব্যবহৃত হয়।
Random Access File Operations এর উপাদান:
seekg(offset, direction): ইনপুট ফাইল স্ট্রিমের অবস্থান পরিবর্তন করে।offset: কতটা দূরে যেতে হবে তা নির্দেশ করে।direction: কোথা থেকে গণনা করা হবে (ফাইলের শুরু, বর্তমান অবস্থান, অথবা ফাইলের শেষ)।std::ios::beg: ফাইলের শুরু থেকে।std::ios::cur: বর্তমান অবস্থান থেকে।std::ios::end: ফাইলের শেষ থেকে।
seekp(offset, direction): আউটপুট ফাইল স্ট্রিমের অবস্থান পরিবর্তন করে।tellg(): ইনপুট ফাইল স্ট্রিমের বর্তমান অবস্থান (পজিশন) ফিরে আসে।tellp(): আউটপুট ফাইল স্ট্রিমের বর্তমান অবস্থান ফিরে আসে।
উদাহরণ: Random Access File Operations
১. ফাইলের নির্দিষ্ট অংশে পাঠ করা
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::fstream file;
file.open("example.txt", std::ios::in | std::ios::out); // ফাইল ওপেন
if (!file) {
std::cerr << "File could not be opened!" << std::endl;
return 1;
}
// ফাইলের 5ম বাইট থেকে শুরু করা
file.seekg(4, std::ios::beg); // 4 বাইট ফাইলের শুরু থেকে
std::string str;
std::getline(file, str); // ফাইল থেকে একটি লাইন পড়া
std::cout << "Data from the file: " << str << std::endl;
file.close(); // ফাইল বন্ধ করা
return 0;
}এখানে, seekg(4, std::ios::beg) ব্যবহার করে ফাইলের শুরু থেকে 4 বাইট অগ্রসর হয়েছে এবং তারপরে std::getline() ফাংশন ব্যবহার করে একটি লাইন পড়া হয়েছে।
২. ফাইলে নির্দিষ্ট স্থানে লেখার জন্য
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::fstream file;
file.open("example.txt", std::ios::in | std::ios::out);
if (!file) {
std::cerr << "File could not be opened!" << std::endl;
return 1;
}
// ফাইলের 10ম বাইটে লেখার জন্য অবস্থান করা
file.seekp(9, std::ios::beg); // 9 বাইট ফাইলের শুরু থেকে
// নতুন ডেটা লেখার জন্য
file << "Hello, World!";
file.close();
return 0;
}এখানে, seekp(9, std::ios::beg) ব্যবহার করে ফাইলের 10ম বাইটে পৌঁছানো হয়েছে এবং তারপর নতুন ডেটা লিখে ফেলা হয়েছে।
৩. ফাইলের শেষে লেখা (Append Mode)
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::fstream file;
file.open("example.txt", std::ios::out | std::ios::app); // append mode
if (!file) {
std::cerr << "File could not be opened!" << std::endl;
return 1;
}
// ফাইলের শেষে লেখা
file << "Appending new data at the end.\n";
file.close();
return 0;
}এখানে std::ios::app মোডে ফাইল ওপেন করা হয়েছে, যা ফাইলের শেষে ডেটা অ্যাপেন্ড করে।
ফাইল পজিশন চেক করা
আপনি tellg() এবং tellp() ফাংশন ব্যবহার করে ইনপুট এবং আউটপুট ফাইল স্ট্রিমের পজিশন চেক করতে পারেন।
উদাহরণ: পজিশন চেক করা
#include <iostream>
#include <fstream>
int main() {
std::fstream file;
file.open("example.txt", std::ios::in | std::ios::out);
if (!file) {
std::cerr << "File could not be opened!" << std::endl;
return 1;
}
file.seekg(5, std::ios::beg); // ফাইলের 5ম বাইটে যাওয়া
std::cout << "Current position: " << file.tellg() << std::endl; // পজিশন দেখানো
file.seekp(10, std::ios::beg); // 10ম বাইটে যাওয়া
std::cout << "Current position: " << file.tellp() << std::endl; // পজিশন দেখানো
file.close();
return 0;
}আউটপুট:
Current position: 5
Current position: 10এখানে, tellg() এবং tellp() ফাংশন ব্যবহার করে ইনপুট এবং আউটপুট স্ট্রিমের বর্তমান অবস্থান মুদ্রিত হয়েছে।
উপসংহার
seekg()এবংseekp()ফাংশনগুলি ইনপুট এবং আউটপুট ফাইলের অবস্থান পরিবর্তন করতে ব্যবহৃত হয়।tellg()এবংtellp()ফাংশনগুলি বর্তমান অবস্থান দেখতে ব্যবহৃত হয়।- Random access file operations ব্যবহারের মাধ্যমে আপনি ফাইলের যে কোনো অংশে দ্রুতভাবে পৌঁছাতে পারেন, যা খুবই কার্যকরী যখন বড় ফাইলের ডেটা প্রক্রিয়া করতে হয়।
এই ধরনের অপারেশনগুলি ফাইল ম্যানিপুলেশনকে আরও নমনীয় ও দক্ষ করে তোলে এবং বিশেষ করে বড় ফাইল বা ডেটাবেসের কাজ করার জন্য অত্যন্ত উপকারী।
সি++ এ ফাইল অপারেশন করার সময় প্রায়শই ত্রুটি (error) হতে পারে, যেমন ফাইলটি খুঁজে পাওয়া যাচ্ছে না, ফাইল পড়তে বা লিখতে সমস্যা হচ্ছে, ইত্যাদি। সঠিকভাবে এই ত্রুটিগুলো পরিচালনা করতে Exception Handling ব্যবহৃত হয়। Exception Handling ব্যবহার করে প্রোগ্রামটিকে ত্রুটি সনাক্ত ও মোকাবিলা করার জন্য প্রস্তুত রাখা যায়। এখানে কিছু সাধারণ ফাইল অপারেশন এবং Exception Handling এর মাধ্যমে সেগুলো কিভাবে নিরাপদে পরিচালনা করা যায় তা আলোচনা করা হলো।
ফাইল অপারেশনস
সি++ এ ফাইল অপারেশনের জন্য সাধারণত fstream লাইব্রেরির ক্লাসগুলো ব্যবহৃত হয়, যেমন:
std::ifstream: ফাইল থেকে ডেটা পড়ার জন্য।std::ofstream: ফাইলে ডেটা লেখার জন্য।std::fstream: ফাইল পড়া এবং লেখা উভয়ের জন্য।
Exception Handling সহ ফাইল খোলা এবং পড়া
ফাইল খোলার সময় যদি ফাইলটি বিদ্যমান না থাকে, তবে এটি একটি সাধারণ ত্রুটি সৃষ্টি করতে পারে। Exception Handling ব্যবহার করে এই ত্রুটিগুলো ধরার চেষ্টা করা হয়।
উদাহরণ: ফাইল খোলা এবং পড়া
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream file;
try {
file.open("example.txt");
// চেক করা হচ্ছে ফাইলটি সফলভাবে খোলা হয়েছে কিনা
if (!file.is_open()) {
throw std::ios_base::failure("Error opening file");
}
// ফাইলের ডেটা পড়া
std::string line;
while (std::getline(file, line)) {
std::cout << line << std::endl;
}
file.close(); // ফাইল বন্ধ করা
} catch (const std::ios_base::failure& e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
return 0;
}এই উদাহরণে, ফাইল খোলার চেষ্টা করার পর চেক করা হচ্ছে যে ফাইলটি সফলভাবে খোলা গেছে কিনা। যদি না যায়, তাহলে std::ios_base::failure এর মাধ্যমে একটি Exception তৈরি করে catch ব্লকে ধরার চেষ্টা করা হয়েছে।
Exception Handling সহ ফাইলে লেখা
ফাইলে লেখার সময় যদি কোনো সমস্যা হয়, যেমন ফাইলটি লেখার জন্য প্রস্তুত নয় বা যথাযথ অনুমতি নেই, তবে Exception Handling এর মাধ্যমে এই সমস্যাগুলো নির্ণয় করা যায়।
উদাহরণ: ফাইলে লেখা
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ofstream file;
try {
file.open("output.txt");
// ফাইল খোলা যাচাই
if (!file.is_open()) {
throw std::ios_base::failure("Error opening file for writing");
}
// ফাইলে ডেটা লেখা
file << "This is a test line." << std::endl;
file.close(); // ফাইল বন্ধ করা
} catch (const std::ios_base::failure& e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
return 0;
}এখানে, ফাইল খোলার পর is_open() চেক করে যদি ফাইল লেখার জন্য প্রস্তুত না থাকে তাহলে std::ios_base::failure Exception নিক্ষেপ করা হয় এবং এটি catch ব্লকে ধরা হয়।
Multiple Exceptions Handling
একাধিক ধরণের Exception থাকলে বিভিন্ন catch ব্লক ব্যবহার করে সেগুলো আলাদাভাবে ধরা যায়। যেমন, ফাইল পড়া, লেখা, বা অন্যান্য ইন্টারনাল ত্রুটি হলে পৃথক পৃথক catch ব্লক ব্যবহার করা যায়।
উদাহরণ: একাধিক Exception Handling
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream file;
try {
file.open("example.txt");
if (!file.is_open()) {
throw std::ios_base::failure("File not found");
}
// ইন্টারনাল ফাইল ত্রুটি চেক করার জন্য
file.exceptions(std::ifstream::badbit | std::ifstream::failbit);
std::string line;
while (std::getline(file, line)) {
std::cout << line << std::endl;
}
file.close();
} catch (const std::ios_base::failure& e) {
std::cerr << "File operation exception: " << e.what() << std::endl;
} catch (const std::exception& e) {
std::cerr << "General exception: " << e.what() << std::endl;
}
return 0;
}উপরের উদাহরণে, file.exceptions() ফাংশন ব্যবহার করে ফাইল অপারেশনে কিছু নির্দিষ্ট ত্রুটি (badbit এবং failbit) চেক করা হচ্ছে। যদি কোনো সমস্যা হয়, তাহলে প্রথম catch ব্লক std::ios_base::failure এক্সসেপশন ধরবে, আর যদি অন্য কোনো সাধারণ Exception থাকে, তাহলে সেটি পরের catch ব্লক দ্বারা ধরা হবে।
Exception Handling এর সুবিধা
১. ত্রুটি সনাক্তকরণ: ফাইল অপারেশনের সময় যে কোনো সমস্যা সহজে সনাক্ত করা যায়।
২. প্রোগ্রামের স্থিতিশীলতা: Exception Handling ব্যবহার করে ত্রুটি হলে প্রোগ্রামটি অপ্রত্যাশিতভাবে বন্ধ না হয়ে সঠিকভাবে ত্রুটি মোকাবিলা করতে পারে।
৩. ডিবাগিং সহজতর: Exception Handling ব্যবহার করে ত্রুটির ধরন এবং কারণ সহজে চিহ্নিত করা যায়।
সংক্ষেপে
- Exception Handling ফাইল অপারেশনের ত্রুটি সনাক্ত করতে সহায়ক।
std::ios_base::failureব্যবহার করে ফাইল অপারেশন ত্রুটি ধরা যায়।- Multiple catch blocks ব্যবহার করে একাধিক ধরণের Exception আলাদাভাবে পরিচালনা করা যায়।
ফাইল অপারেশনে Exception Handling ব্যবহারের ফলে প্রোগ্রামের স্থায়িত্ব বৃদ্ধি পায় এবং ফাইল সম্পর্কিত ত্রুটি সহজে মোকাবিলা করা যায়।
Read more