উত্তর:
একটি ফাইল বর্ণনাকারী হ'ল একটি নিম্ন স্তরের পূর্ণসংখ্যার "হ্যান্ডেল" যা লিনাক্স এবং অন্যান্য ইউনিক্স-মতো সিস্টেমে কার্নেল স্তরে খোলা ফাইল (বা সকেট, বা যা কিছু) সনাক্ত করতে ব্যবহৃত হয়।
আপনি যেমন প্রকৃত ইউনিক্স কল, থেকে "নগ্ন" ফাইল বর্ণনাকারী পাস read()
, write()
ইত্যাদি।
একটি FILE
পয়েন্টার হ'ল সি স্ট্যান্ডার্ড লাইব্রেরি-স্তরের কনস্ট্রাক্ট, যা কোনও ফাইল উপস্থাপনের জন্য ব্যবহৃত হয়। FILE
ফাইল বর্ণনাকারী গোপন, এবং বাফার উপলব্ধ এবং অন্যান্য বৈশিষ্ট্য যোগ করা, I / O সহজ করতে।
আপনি FILE
স্ট্যান্ডার্ড সি ফাংশনগুলিতে পয়েন্টারগুলি পাস করেন fread()
এবং যেমন fwrite()
।
fd
এটি প্রথম যুক্তি read()
। এটাকে উলঙ্গ বলছ কেন?
FILE *
ধরণের তুলনায় , পূর্ণসংখ্যা ফাইল বর্ণনাকারী "কম মোড়ানো", অর্থাত "নগ্ন" is
একটি বাফার ( FILE *
) এবং অন্যটি নয়। অনুশীলনে, আপনি FILE *
যখনই কোনও 'আসল' ফাইল (যেমন ড্রাইভে) থেকে পড়ছেন তখন আপনি প্রায় সর্বদা ব্যবহার করতে চান, আপনি যদি না জানেন যে আপনি কী করছেন বা যদি না আপনার ফাইলটি আসলে সকেট বা না হয় ..
আপনি FILE *
ব্যবহার থেকে ফাইল বিবরণী পেতে পারেন fileno()
এবং আপনি FILE *
একটি ফাইল বর্ণনাকারী ব্যবহার করে একটি বাফার খুলতে পারেনfdopen()
একটি ফাইল বর্ণনাকারী কেবল একটি পূর্ণসংখ্যা যা আপনি পসিক্স open()
কল থেকে পান । স্ট্যান্ডার্ড সি ব্যবহার করে fopen()
আপনি FILE
স্ট্রাক্ট ফিরে পাবেন। FILE
Struct হয় যেমন শেষ অফ ফাইল এবং ত্রুটি নির্দেশক, স্ট্রিম অবস্থান ইত্যাদি অন্যান্য বিষয়ের মধ্যে এই ফাইলটি বর্ণনাকারী রয়েছে
সুতরাং ব্যবহার fopen()
আপনাকে তুলনায় তুলনায় একটি নির্দিষ্ট পরিমাণ বিমূর্ততা দেয় open()
। সাধারণভাবে আপনার ব্যবহার করা উচিত fopen()
যেহেতু এটি আরও পোর্টেবল এবং আপনি স্ট্রাক ব্যবহার করে এমন সমস্ত স্ট্যান্ডার্ড সি ফাংশন ব্যবহার করতে পারেন FILE
, অর্থাৎ, fprintf()
এবং পরিবার।
হয় ব্যবহার করে কোনও কার্যকারিতা সংক্রান্ত সমস্যা নেই issues
ফাইল বর্ণনাকারী বনাম ফাইল পয়েন্টার
ফাইল বর্ণনাকারী:
ফাইল ডেস্ক্রিপ্টর হ'ল open()
সিস্টেম কল দ্বারা ফেরত দেওয়া একটি পূর্ণসংখ্যা মান ।
int fd = open (filePath, mode);
ফাইল পয়েন্টার:
ফাইল পয়েন্টার একটি সি কাঠামো দ্বারা ফিরে একটি পয়েন্টার fopen()
গ্রন্থাগার ফাংশন, যা ব্যবহার করা হয় , একটি ফাইল চিহ্নিত ফাইল বর্ণনাকারী মোড়কে, কার্যকারিতা এবং অন্যান্য আমি জন্য কার্যকারিতা বাফার উপলব্ধ ইনপুট / আউটপুট অপারেশন লোকের ফাইল পয়েন্টার ধরনের হয় ফাইল , যার সংজ্ঞা "/usr/incolve/stdio.h" এ পাওয়া যাবে । এই সংজ্ঞাটি অন্য সংকলক থেকে আলাদা হতে পারে।
FILE *fp = fopen (filePath, mode);
// A FILE Structure returned by fopen
typedef struct
{
unsigned char *_ptr;
int _cnt;
unsigned char *_base;
unsigned char *_bufendp;
short _flag;
short _file;
int __stdioid;
char *__newbase;
#ifdef _THREAD_SAFE
void *_lock;
#else
long _unused[1];
#endif
#ifdef __64BIT__
long _unused1[4];
#endif /* __64BIT__ */
} FILE;
পয়েন্টগুলি যুক্ত করতে চান যা দরকারী হতে পারে।
সম্পর্কিত FILE *
আমি এটি বহুবার ডিবাগ লগের জন্য ব্যবহার করি। উদাহরণস্বরূপ,
FILE *fp;
fp = fopen("debug.txt","a");
fprintf(fp,"I have reached till this point");
fclose(fp);
সম্পর্কিত FILE DESCRIPTOR
এটি সাধারণত আইপিসির জন্য ব্যবহৃত হয়।
* নিক্স সিস্টেমে ফাইলগুলিকে নিম্ন-স্তরের নিয়ন্ত্রণ দেয় devices (ডিভাইস, ফাইল, সকেট, ইত্যাদি), সুতরাং এর চেয়ে বেশি পাওয়ারফুল FILE *
।
fdopen()
আইপিসি এবং ডিভাইসগুলির মতো জিনিসগুলি ব্যবহার করতে পারবেন না FILE*
?
FILE*
তবে আপনি FILE*
কোনও ফাইল বর্ণনাকারী ( fdopen()
) থেকে একটি তৈরি করতে পারেন এবং পরে এটি বন্ধ করে ডিসক্রিপটরটি বন্ধ করে FILE
দেবেন। অতএব, আপনি পারেন না আইপিসি, কিন্তু আপনি একটি সামান্য বিট ফাইল বর্ণনাকারী সঙ্গে মোকাবিলা করার জন্য কোনো সরাসরি আইপিসি সহজতর করতে হবে।
FILE *
যখন আপনি টেক্সট ফাইল এবং ব্যবহারকারীর ইনপুট / আউটপুট সঙ্গে কাজ করা হয়েছে কারণ এটি আপনি এপিআই ফাংশন মত ব্যবহার করার অনুমতি দেয় আরো উপযোগী হয় sprintf()
, sscanf()
, fgets()
, feof()
ইত্যাদি
ফাইল বিবরণকারী এপিআই নিম্ন-স্তরের, সুতরাং এটি সকেট, পাইপ, মেমরি-ম্যাপযুক্ত ফাইলগুলি (এবং অবশ্যই নিয়মিত ফাইলগুলি) দিয়ে কাজ করার অনুমতি দেয়।
আলোচনা শেষ করার জন্য একটি নোট (আগ্রহী হলে) ....
fopen
নিরাপত্তাহীন হতে পারে এবং আপনার সম্ভবত ব্যবহার করা উচিত fopen_s
বা open
একচেটিয়া বিট সেট সহ with C1X প্রস্তাব করা হয় x
মোড, তাই আপনি যা করতে পারেন fopen
মোডের "rx"
, "wx"
ইত্যাদি
আপনি যদি ব্যবহার করেন তবে আপনি open
বিবেচনা করতে পারেন open(..., O_EXCL | O_RDONLY,... )
বা open(..., O_CREAT | O_EXCL | O_WRONLY,... )
।
উদাহরণস্বরূপ দেখুন, ফোপেন () এবং ফাইল তৈরি সম্পর্কে অনুমান করবেন না ।
fopen_s
সঙ্গে পাওয়া যাবে বলে মনে হচ্ছে না POSIX
, আমি অনুমান সবচেয়ে পোর্টেবল soultion হবে open(2)
এবং তারপর fdopen(2)
। (উইন্ডো একপাশে রেখে) এছাড়াও, কি দ্রুত fopen_s()
বা open(2)
অনুসরণ করা হবে fdopen(2)
?
সিস্টেম কলগুলি বেশিরভাগই ফাইল বর্ণনাকারী ব্যবহার করে থাকে, উদাহরণস্বরূপ read
এবং write
। লাইব্রেরি ফাংশন ফাইল পয়েন্টার ( printf
, scanf
) ব্যবহার করবে । তবে, লাইব্রেরির ফাংশনগুলি কেবল অভ্যন্তরীণ সিস্টেম কলগুলি ব্যবহার করছে।
আমি একটি ভাল রিসোর্চ বর্তমানে পাওয়া এখানে , দুই মধ্যে পার্থক্য উচ্চ পর্যায়ের ওভারভিউ দান:
আপনি যখন কোনও ফাইলে ইনপুট বা আউটপুট করতে চান, আপনার প্রোগ্রাম এবং ফাইলের মধ্যে সংযোগ উপস্থাপনের জন্য আপনার কাছে দুটি বুনিয়াদি প্রক্রিয়া রয়েছে: ফাইল বর্ণনাকারী এবং স্ট্রিম। ফাইল বর্ণনাকারীগুলি টাইপ ইন্টের অবজেক্ট হিসাবে উপস্থাপিত হয়, যখন স্ট্রিমগুলি FILE * অবজেক্ট হিসাবে প্রতিনিধিত্ব করা হয়।
ফাইল বর্ণনাকারীরা ইনপুট এবং আউটপুট ক্রিয়াকলাপগুলিতে একটি আদিম, নিম্ন-স্তরের ইন্টারফেস সরবরাহ করে। ফাইল বর্ণনাকারী এবং স্ট্রিম উভয়ই কোনও ডিভাইসের সাথে সংযোগ (যেমন টার্মিনাল), বা অন্য কোনও প্রক্রিয়াতে যোগাযোগের জন্য পাইপ বা সকেট, পাশাপাশি একটি সাধারণ ফাইলকে প্রতিনিধিত্ব করতে পারে। তবে, আপনি যদি কোনও বিশেষ ধরণের ডিভাইসের সাথে সুনির্দিষ্ট কন্ট্রোল অপারেশন করতে চান তবে আপনাকে অবশ্যই একটি ফাইল বর্ণনাকারী ব্যবহার করতে হবে; এইভাবে স্ট্রিম ব্যবহার করার কোনও সুবিধা নেই। আপনার প্রোগ্রামটি যদি বিশেষ মোডে ইনপুট বা আউটপুট যেমন ননব্লকিং (বা পোলড) ইনপুট (ফাইলের স্ট্যাটাস ফ্ল্যাগগুলি দেখুন) করতে হয় তবে আপনাকে অবশ্যই ফাইল বর্ণনাকারী ব্যবহার করতে হবে।
স্ট্রিমগুলি একটি উচ্চ-স্তরের ইন্টারফেস সরবরাহ করে, আদিম ফাইল বর্ণনাকারী সুবিধার উপরে স্তরযুক্ত। স্ট্রিম ইন্টারফেস সব ধরণের ফাইলকে অনেক বেশি একইভাবে আচরণ করে — আপনি বেছে নিতে পারেন এমন তিনটি স্টাইল বাফারিংয়ের একমাত্র ব্যতিক্রম (স্ট্রিম বাফারিং দেখুন)।
স্ট্রিম ইন্টারফেসটি ব্যবহারের প্রধান সুবিধা হ'ল স্ট্রিমগুলিতে প্রকৃত ইনপুট এবং আউটপুট ক্রিয়াকলাপ সম্পাদনের জন্য ফাংশনগুলির সেট (ফাইল পরিচালনা করার জন্য সম্পর্কিত সুবিধাগুলির তুলনায় আরও সমৃদ্ধ এবং বেশি শক্তিশালী)। ফাইল বর্ণনাকারী ইন্টারফেস অক্ষরগুলির ব্লক স্থানান্তর করার জন্য কেবল সাধারণ ফাংশন সরবরাহ করে তবে স্ট্রিম ইন্টারফেসটি শক্তিশালী ফর্ম্যাটযুক্ত ইনপুট এবং আউটপুট ফাংশন (প্রিন্টফ এবং স্ক্যানফ) পাশাপাশি অক্ষর এবং লাইন-ভিত্তিক ইনপুট এবং আউটপুট সরবরাহ করে।
যেহেতু স্ট্রিমগুলি ফাইল বর্ণনাকারীদের ক্ষেত্রে কার্যকর করা হয়, আপনি একটি স্ট্রিম থেকে ফাইল বর্ণনাকারী আহরণ করতে পারেন এবং সরাসরি ফাইল বিবরণীতে নিম্ন-স্তরের ক্রিয়াকলাপ সম্পাদন করতে পারেন। আপনি প্রাথমিকভাবে কোনও ফাইল বর্ণনাকারী হিসাবে কোনও সংযোগ খুলতে পারেন এবং তারপরে সেই ফাইল বর্ণনাকারীর সাথে যুক্ত একটি স্ট্রিম তৈরি করতে পারেন।
সাধারণভাবে, ফাইল বর্ণনাকারীর পরিবর্তে আপনার স্ট্রিম ব্যবহার করা উচিত, যদি না আপনি কিছু নির্দিষ্ট ক্রিয়াকলাপ করতে চান তবে এটি কেবল একটি ফাইল বিবরণীতে করা যায়। আপনি যদি কোনও প্রারম্ভিক প্রোগ্রামার হন এবং কোন ফাংশনগুলি ব্যবহার করবেন তা নিশ্চিত না হলে আমাদের পরামর্শ দেওয়া হয় আপনি ফর্ম্যাট করা ইনপুট ফাংশন (ফর্ম্যাটড ইনপুট দেখুন) এবং ফর্ম্যাট আউটপুট ফাংশন (ফর্ম্যাটড আউটপুট দেখুন)।
আপনি যদি জিএনইউ ব্যতীত অন্য সিস্টেমে আপনার প্রোগ্রামগুলির বহনযোগ্যতার বিষয়ে উদ্বিগ্ন হন তবে আপনার সচেতন হওয়া উচিত যে ফাইল বর্ণনাকারীরা স্ট্রিমের মতো পোর্টেবল নয়। স্ট্রিমগুলিকে সমর্থন করার জন্য আইএসও সি-তে চলমান যে কোনও সিস্টেম আপনি আশা করতে পারেন, তবে নন-জিএনইউ সিস্টেমগুলি ফাইল বর্ণনাকারীদের মোটেই সমর্থন করতে পারে না বা কেবল ফাইল বর্ণনাকারীদের উপর পরিচালিত জিএনইউ ফাংশনগুলির একটি উপসেট বাস্তবায়ন করতে পারে। জিএনইউ সি লাইব্রেরির বেশিরভাগ ফাইল বর্ণনাকারী ফাংশন POSIX.1 স্ট্যান্ডার্ডের মধ্যে অন্তর্ভুক্ত রয়েছে।