কম্পিউটার টিউটোরিয়াল

সি প্রোগ্রামিং-এ read() সিস্টেম কল দক্ষতা অর্জন: একটি جامع গাইড

সি ভাষায় ফাইল পড়ার জন্য বেশ কিছু ফাংশন রয়েছে, 그중 সবচেয়ে সাধারণ হলো read() এবং fread() ফাংশন। এই ভাষা getchar() এর মতো ফাংশন দিয়ে ক্যারেক্টার বাই ক্যারেক্টার পড়ার পদ্ধতিও প্রদান করে।

ফাইল প্রসেসিং ফাংশনগুলো, তাদের কল পদ্ধতি, ইনপুট ও আউটপুট আর্গুমেন্ট ইত্যাদি জানা অত্যন্ত গুরুত্বপূর্ণ যাতে প্রোগ্রামার সিস্টেমে সংরক্ষিত তথ্য সংরক্ষণ ও নিষ্কাশন করতে সক্ষম হন।

এই লিনাক্সহিন্ট আর্টিকেলে, আপনি শিখবেন কীভাবে read() ফাংশন ব্যবহার করে ফাইল পড়া যায়।

আমরা এই ফাংশনের সিনট্যাক্স, কল পদ্ধতি, ইনপুট ও আউটপুট আর্গুমেন্ট, প্রতিটি যে ডেটা টাইপ গ্রহণ করে, এবং সেগুলো সঠিকভাবে কীভাবে ঘোষণা করতে হয় সে সম্পর্কে সবকিছু ব্যাখ্যা করব।

তারপর আমরা শিখতে প্রয়োগিক উদাহরণের মাধ্যমে এই ফিচারের ব্যবহার দেখাব।

read() ফাংশন ব্যবহার করার পূর্ণ জ্ঞান দেওয়ার জন্য, আমরা একটি বিশেষ বিভাগ যোগ করেছি যা এই ফাংশন ব্যবহার করার সময় যাবতীয় সব ত্রুটি, তাদের সনাক্তকরণ ও শনাক্ত করার কৌশল বর্ণনা করে, যাতে ত্রুটি হলে দ্রুত সমাধান করতে পারেন।

সি ভাষায় Read() ফাংশনের সিনট্যাক্স

size_t read(int fd, void *buf, size_t count);

Read() ফাংশনের বর্ণনা

read() ফাংশন "fd" ইনপুট আর্গুমেন্টে নির্দিষ্ট খোলা ফাইলের কন্টেন্ট পড়ে। এই ফাংশন ফাইলের কন্টেন্ট পড়ে এবং "buf" দ্বারা নির্দেশিত বাফারে "count" সংখ্যক বাইট কপি করে। "fd" আইডেন্টিফায়ার একটি ইন্টিজার যা open() ফাংশন ফাইল খোলার ফলাফল হিসেবে রিটার্ন করে।

যদি read() ফাংশন সফলভাবে রিটার্ন করে, তবে এটি পড়া বাইটের সংখ্যা রিটার্ন করে। ০ এর ফলাফল মানে ফাইল শেষ পর্যন্ত পড়া হয়েছে, এবং -1 মানে একটি ত্রুটি হয়েছে।

নির্দিষ্ট ত্রুটি গ্লোবাল "errno" ভেরিয়েবল থেকে এর কোড রিট্রিভ করে শনাক্ত করা যায়। পরে আপনি একটি বিভাগ পাবেন যা read() ফাংশন ব্যবহার করার সময় যাবতীয় ত্রুটি এবং তাদের সনাক্ত ও শনাক্ত করার কৌশল বর্ণনা করে।

read() ফাংশন "unistd.h" হেডারে ডিক্লেয়ার করা আছে। এটি ব্যবহার করতে আপনাকে আপনার কোডে এই ফাইলটি ইনক্লুড করতে হবে নিচের মত করে:

Read() ফাংশন দিয়ে ফাইল কীভাবে পড়বেন

এই উদাহরণে, আমরা open() এবং read() ফাংশন ব্যবহার করে ফাইল খোলা ও পড়ার পদ্ধতি ব্যাখ্যা করব।

এই উদ্দেশ্যে, আমরা পূর্বে লিনাক্স ম্যানেজার দিয়ে "example.txt" নামে একটি টেক্সট ফাইল তৈরি করেছিলাম এবং "Documents" ডিরেক্টরিতে সংরক্ষণ করেছিলাম। তারপর আমরা এই আর্টিকেলের প্রথম প্যারাগ্রাফটি সেখানে লিখেছিলাম।

ফাইল পড়ার কোড বিকাশের প্রথম ধাপ হলো প্রয়োজনীয় হেডারগুলো ইনক্লুড করা এবং খালি ভ্যালু রিটার্ন করে এমন একটি main() ফাংশন তৈরি করা। আমরা এতে "fd" ইন্টিজার ডিফাইন করি যা ফাইল ডেসক্রিপ্টর হিসেবে কাজ করে, একটি 1024 ক্যারেক্টার বাফার যাকে "buff" বলা হয় যেখানে read() দ্বারা পড়া তথ্য সংরক্ষিত হবে। পাথ অ্যারে ফাইলের পাথ ও নাম সংরক্ষণ করে যা আমরা পড়তে চাই।

প্রয়োজনীয় ভেরিয়েবল ডিফাইন করার পর, আমরা ফাইল খোলার জন্য open() ফাংশন কল করি। আমরা এই ফাংশনটি কল করি পাথ অ্যারে (ফাইলের পাথ ও নাম) প্রথম ইনপুট আর্গুমেন্ট হিসেবে এবং দ্বিতীয় আর্গুমেন্ট হিসেবে O_RDONLY ফ্ল্যাগ স্পেসিফাই করে। আউটপুট আর্গুমেন্ট হিসেবে আমরা "fd" ইন্টিজার পাস করি যেখানে open() ডেসক্রিপ্টর রিটার্ন করে যা আমরা পরে ফাইল পড়তে ব্যবহার করব।

ফাইল খোলার পর, আমরা read() ফাংশন কল করে এর কন্টেন্ট পড়ি এবং প্রথম আর্গুমেন্ট হিসেবে open() ফাংশন দ্বারা রিটার্ন করা "fd" ডেসক্রিপ্টর পাস করি। দ্বিতীয় আর্গুমেন্ট হিসেবে "buff" বাফারへর পয়েন্টার পাস করি যেখানে পড়া কন্টেন্ট সংরক্ষিত হবে এবং শেষে বাফারের আকার যা এই ক্ষেত্রে 1024 বাইট।

তারপর আমরা printf() ফাংশন ব্যবহার করে buff-এ সংরক্ষিত কন্টেন্ট কমান্ড কনসোলে প্রদর্শন করি। এই উদাহরণের সম্পূর্ণ কোড নিচে দেওয়া হলো:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main()
{
 int fd;
 char buff[1024];
 char path[] = "Documents/example.txt";
 fd = open(path, O_RDONLY);
 read(fd, buff, 1024);
 printf("\n\n%s\n\n",buff);
}

নিচের ছবিতে এই কোডের কম্পাইলেশন ও এক্সিকিউশন দেখানো হয়েছে। আমরা দেখতে পাচ্ছি, read() "example.txt" ফাইলের সম্পূর্ণ কন্টেন্ট "buff"-এ রাখে এবং printf() ফাংশন সেটি কমান্ড কনসোলে প্রিন্ট করে:

সি প্রোগ্রামিং-এ read() সিস্টেম কল দক্ষতা অর্জন: একটি جامع গাইড

Read() ফাংশন ব্যবহার করার সময় ত্রুটি সনাক্ত ও শনাক্ত করার পদ্ধতি

read() ব্যবহার করলে বিভিন্ন ত্রুটি হতে পারে। ऐसा হলে, এই ফাংশন -1 এর সমান ফলাফল রিটার্ন করে।

ত্রুটি হয়েছে কিনা নির্ধারণ করার সবচেয়ে সহজ উপায় হলো একটি "if" কন্ডিশন ব্যবহার করা যেখানে কন্ডিশন হলো -1 রিটার্ন ভ্যালু। এখন দেখি কীভাবে এই মেথড ব্যবহার করে ত্রুটি সনাক্ত করা যায়:

int n;
n = read(fd, buff , 1024);
if ( n == -1){
 printf ("An error occurred while trying to read the file.");
}

যদি read() ফাংশন ত্রুটি দিয়ে রিটার্ন করে, তবে এটি "if" স্টেটমেন্টে চলে যায় এবং "An error occurred while trying to read the file" মেসেজ প্রিন্ট করে।

যখন ত্রুটি হয়, একটি чисবাচক কোড অটোমেটিক্যালি গ্লোবাল "errno" ভেরিয়েবলে সংরক্ষিত হয় যা "errno.h" হেডারে ডিফাইন করা থাকে। এই কোড ব্যবহার করে হওয়া ত্রুটি শনাক্ত করা যায়।

নিচে read() ফাংশন দ্বারা জেনারেট হতে পারা ত্রুটির একটি তালিকা দেওয়া হলো যা "errno.h" হেডারে ডিফাইন করা আছে, প্রতিটি ত্রুটির সংক্ষিপ্ত বিবরণ এবং সংশ্লিষ্ট ইন্টিজার ভ্যালুসহ:

Error Value in errno Description
EAGAIN 11 Try again
EBADF 9 Incorrect file number
EDESTADDRREQ 89 Destination address required
EFAULT 14 Incorrect address
EFBIG 27 File too big
EINTR 4 System call interrupted
EINVAL 22 Invalid argument
EIO 5 I/O error
EPERM 1 Operation not allowed

ত্রুটি শনাক্ত করার সবচেয়ে সহজ উপায় হলো একটি সুইচ খোলা যেখানে "errno" ভেরিয়েবল জাম্প কন্ডিশন এবং প্রতিটি কেস একটি ত্রুটির ডেফিনিশন।

এখন একটি উদাহরণ দেখি যেখানে আমরা একটি নেগেটিভ ডেসক্রিপ্টর डालার চেষ্টা করি, যার ফলে একটি ত্রুটি হয়। ত্রুটি সনাক্ত করতে আমরা পূর্বের স্নিপেটে দেখানো "if" কন্ডিশন ব্যবহার করি। শনাক্ত করতে আমরা এই ফাংশন দ্বারা উত্পন্ন হতে পারা তিনটি সবচেয়ে সাধারণ ত্রুটির সাথে একটি সুইচ খোলি।

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

int main()
{
 int fd,n;
 char buff[1024];
 char path[] = "Documents/example.txt";
 fd = open(path, O_RDONLY);

 n = read(99999999, buff, 1024);
 if (n == -1){
 switch(errno){
 case EBADF:{
 printf("Bad file number. Error: %i\n", errno);
 break;}
 case EINVAL:{
 printf("Invalid argument. Error: %i\n", errno);
 break;}
 case EIO:{
 printf("I/O error . Error: %i\n", errno);
 break;}
 }
 }
}

নিচের ছবিতে দেখা যাচ্ছে, read() ফাংশন একটি ত্রুটি রিটার্ন করে যখন একটি অবৈধ ডেসক্রিপ্টর ইনপুট আর্গুমেন্ট হিসেবে পাস করা হয়, এবং "errno" ভেরিয়েবল থেকে রিট্রিভ করা ভ্যালু যা জাম্প কন্ডিশন হিসেবে ব্যবহার করা হয়েছে, EBADF কেসে প্রবেশ করে ত্রুটি শনাক্ত করতে সক্ষম করে।

সি প্রোগ্রামিং-এ read() সিস্টেম কল দক্ষতা অর্জন: একটি جامع গাইড

উপসংহার

এই লিনাক্সহিন্ট আর্টিকেলে, আমরা আপনাকে দেখিয়েছি কীভাবে read() ফাংশন ব্যবহার করতে হয়, যা সি ভাষায় ফাইল পড়ার জন্য বাস্তবায়ন করা সবচেয়ে সাধারণ ফাংশনlerden একটি।

আমরা এর সিনট্যাক্স এবং একটি বিভাগ দেখেছি যা এর থিয়োরেটিক্যাল অপারেশন, ইনপুট ও আউটপুট আর্গুমেন্ট, এবং এর ডেটা টাইপ বর্ণনা করে। পরে, আমরা একটি প্রয়োগিক উদাহরণে যা শিখলাম তা বাস্তবায়ন করেছি যেখানে কোড ও ছবি দিয়ে দেখানো হয়েছে কীভাবে open() এবং read() ফাংশন ব্যবহার করে ফাইল খোলা ও পড়া যায়।

এই ফাংশন ব্যবহার করার সময় সম্ভাব্য ত্রুটি সমাধান করার জন্য প্রয়োজনীয় উপায় দেওয়ার জন্য, আমরা একটি বিশেষ বিভাগ যোগ করেছি যা সি ভাষা দ্বারা প্রদত্ত ত্রুটি সনাক্ত ও শনাক্ত করার পদ্ধতি ব্যাখ্যা করে।

  1. Android-এ মাল্টিলেভেল ListView (ExpandableListView) তৈরির পদ্ধতি

  2. Tkinter colorchooser মডিউল ব্যবহার করে উইন্ডোর ব্যাকগ্রাউন্ড কালার পরিবর্তন

  3. রুবিতে রেগুলার এক্সপ্রেশন দক্ষতা: একটি প্র্যাক্টিক্যাল গাইড

  4. স্কেলেবল অ্যাপ্লিকেশনের জন্য ৫টি অপরিহার্য Redis ইউজ কেস