একটি ফাইল বর্ণনাকারী এবং ফাইল পয়েন্টার মধ্যে পার্থক্য কি?


114

আমি একটি ফাইল বর্ণনাকারী এবং ফাইল পয়েন্টার মধ্যে পার্থক্য জানতে চাই।

এছাড়াও, আপনি কোন পরিস্থিতিতে অন্যটির পরিবর্তে একটি ব্যবহার করবেন?


উত্তর:


144

একটি ফাইল বর্ণনাকারী হ'ল একটি নিম্ন স্তরের পূর্ণসংখ্যার "হ্যান্ডেল" যা লিনাক্স এবং অন্যান্য ইউনিক্স-মতো সিস্টেমে কার্নেল স্তরে খোলা ফাইল (বা সকেট, বা যা কিছু) সনাক্ত করতে ব্যবহৃত হয়।

আপনি যেমন প্রকৃত ইউনিক্স কল, থেকে "নগ্ন" ফাইল বর্ণনাকারী পাস read(), write()ইত্যাদি।

একটি FILEপয়েন্টার হ'ল সি স্ট্যান্ডার্ড লাইব্রেরি-স্তরের কনস্ট্রাক্ট, যা কোনও ফাইল উপস্থাপনের জন্য ব্যবহৃত হয়। FILEফাইল বর্ণনাকারী গোপন, এবং বাফার উপলব্ধ এবং অন্যান্য বৈশিষ্ট্য যোগ করা, I / O সহজ করতে।

আপনি FILEস্ট্যান্ডার্ড সি ফাংশনগুলিতে পয়েন্টারগুলি পাস করেন fread()এবং যেমন fwrite()


@nvl: fildes Windows- এ নিশ্চয় পাওয়া যায়, যেমন msdn.microsoft.com/en-us/library/z0kc8e3z%28VS.80%29.aspx
kennytm

2
@ আনউইন্ড "নগ্ন" ফাইল বর্ণনাকারী দ্বারা আপনি কী বোঝাতে চেয়েছেন? লিঙ্কযুক্ত রেফারেন্স বলে যে fdএটি প্রথম যুক্তি read()। এটাকে উলঙ্গ বলছ কেন?
গিক

3
@ গীক স্ট্যান্ডার্ড লাইব্রেরির FILE *ধরণের তুলনায় , পূর্ণসংখ্যা ফাইল বর্ণনাকারী "কম মোড়ানো", অর্থাত "নগ্ন" is
বিনোদন

57

একটি বাফার ( FILE *) এবং অন্যটি নয়। অনুশীলনে, আপনি FILE *যখনই কোনও 'আসল' ফাইল (যেমন ড্রাইভে) থেকে পড়ছেন তখন আপনি প্রায় সর্বদা ব্যবহার করতে চান, আপনি যদি না জানেন যে আপনি কী করছেন বা যদি না আপনার ফাইলটি আসলে সকেট বা না হয় ..

আপনি FILE *ব্যবহার থেকে ফাইল বিবরণী পেতে পারেন fileno()এবং আপনি FILE *একটি ফাইল বর্ণনাকারী ব্যবহার করে একটি বাফার খুলতে পারেনfdopen()


12
ফাইলনো () নির্দেশ করার জন্য +1, ম্যান পেজগুলির সংগঠন এটি খুঁজে পাওয়া শক্ত করে। Fdopen () এর জন্য একই।
রিভেনহিল

20

একটি ফাইল বর্ণনাকারী কেবল একটি পূর্ণসংখ্যা যা আপনি পসিক্স open()কল থেকে পান । স্ট্যান্ডার্ড সি ব্যবহার করে fopen()আপনি FILEস্ট্রাক্ট ফিরে পাবেন। FILEStruct হয় যেমন শেষ অফ ফাইল এবং ত্রুটি নির্দেশক, স্ট্রিম অবস্থান ইত্যাদি অন্যান্য বিষয়ের মধ্যে এই ফাইলটি বর্ণনাকারী রয়েছে

সুতরাং ব্যবহার fopen()আপনাকে তুলনায় তুলনায় একটি নির্দিষ্ট পরিমাণ বিমূর্ততা দেয় open()। সাধারণভাবে আপনার ব্যবহার করা উচিত fopen()যেহেতু এটি আরও পোর্টেবল এবং আপনি স্ট্রাক ব্যবহার করে এমন সমস্ত স্ট্যান্ডার্ড সি ফাংশন ব্যবহার করতে পারেন FILE, অর্থাৎ, fprintf()এবং পরিবার।

হয় ব্যবহার করে কোনও কার্যকারিতা সংক্রান্ত সমস্যা নেই issues


8
বহনযোগ্যতা আনার জন্য +1। ফাইল স্ট্যান্ডার্ড সি লাইব্রেরির অংশ (সি 98 / সি 90 এ ফিরে); ফাইল বর্ণনাকারী না।
টমলোগিক

15

ফাইল বর্ণনাকারী বনাম ফাইল পয়েন্টার

ফাইল বর্ণনাকারী:

ফাইল ডেস্ক্রিপ্টর হ'ল open()সিস্টেম কল দ্বারা ফেরত দেওয়া একটি পূর্ণসংখ্যা মান ।

int fd = open (filePath, mode);

  1. নিম্ন / কার্নেল স্তরের হ্যান্ডলার।
  2. ইউনিক্স সিস্টেম কলগুলির () এবং () লেখার জন্য পাস করুন।
  3. বাফারিং এবং এই জাতীয় বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করে না।
  4. কম বহনযোগ্য এবং দক্ষতার অভাব রয়েছে।

ফাইল পয়েন্টার:

ফাইল পয়েন্টার একটি সি কাঠামো দ্বারা ফিরে একটি পয়েন্টার 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;
  1. এটি উচ্চ স্তরের ইন্টারফেস।
  2. ফ্রিড () এবং fwrit () ফাংশনগুলিতে পাস হয়েছে।
  3. বাফারিং, ত্রুটির নির্দেশ এবং ইওএফ সনাক্তকরণ ইত্যাদি অন্তর্ভুক্ত।
  4. উচ্চতর বহনযোগ্যতা এবং দক্ষতা সরবরাহ করে।

1
আপনি কি উচ্চতর দক্ষতার দাবিটি ব্যাক আপ করতে সক্ষম? আমি কখনও শুনিনি।
গিড

1
"দক্ষতা" দাবিটি বাফারিংয়ের কারণে হতে পারে। একটি ফাইল বর্ণনাকারী সহ, প্রতিটি পঠিত () বা লিখন () একটি সিস্কেল এবং প্রতিটি সিস্কেলকে ব্যয়বহুল হিসাবে ভাবা উচিত। একটি ফাইল * দিয়ে, বাফারিং এর অর্থ হল কিছু পাঠ্য এবং লেখার জন্য স্কাইস্কল হবে না।
মাইক স্পিয়ার

12

পয়েন্টগুলি যুক্ত করতে চান যা দরকারী হতে পারে।

সম্পর্কিত FILE *

  1. ইন্টারপ্রসেস যোগাযোগের জন্য ব্যবহার করা যাবে না (আইপিসি)।
  2. আপনার যখন জেনারাল উদ্দেশ্য বাফার I / O প্রয়োজন হয় তখন এটি ব্যবহার করুন print
  3. আমি এটি বহুবার ডিবাগ লগের জন্য ব্যবহার করি। উদাহরণস্বরূপ,

                 FILE *fp;
                 fp = fopen("debug.txt","a");
                 fprintf(fp,"I have reached till this point");
                 fclose(fp);
    

সম্পর্কিত FILE DESCRIPTOR

  1. এটি সাধারণত আইপিসির জন্য ব্যবহৃত হয়।

  2. * নিক্স সিস্টেমে ফাইলগুলিকে নিম্ন-স্তরের নিয়ন্ত্রণ দেয় devices (ডিভাইস, ফাইল, সকেট, ইত্যাদি), সুতরাং এর চেয়ে বেশি পাওয়ারফুল FILE *


আপনি fdopen()আইপিসি এবং ডিভাইসগুলির মতো জিনিসগুলি ব্যবহার করতে পারবেন না FILE*?
ওসভেইন

আসলে, হ্যাঁ এবং না উভয়ই। আপনি আইপিসি সেটআপ এবং আরম্ভ করতে পারবেন না FILE*তবে আপনি FILE*কোনও ফাইল বর্ণনাকারী ( fdopen()) থেকে একটি তৈরি করতে পারেন এবং পরে এটি বন্ধ করে ডিসক্রিপটরটি বন্ধ করে FILEদেবেন। অতএব, আপনি পারেন না আইপিসি, কিন্তু আপনি একটি সামান্য বিট ফাইল বর্ণনাকারী সঙ্গে মোকাবিলা করার জন্য কোনো সরাসরি আইপিসি সহজতর করতে হবে।
মিকাহ ডাব্লু

3

FILE *যখন আপনি টেক্সট ফাইল এবং ব্যবহারকারীর ইনপুট / আউটপুট সঙ্গে কাজ করা হয়েছে কারণ এটি আপনি এপিআই ফাংশন মত ব্যবহার করার অনুমতি দেয় আরো উপযোগী হয় sprintf(), sscanf(), fgets(), feof()ইত্যাদি

ফাইল বিবরণকারী এপিআই নিম্ন-স্তরের, সুতরাং এটি সকেট, পাইপ, মেমরি-ম্যাপযুক্ত ফাইলগুলি (এবং অবশ্যই নিয়মিত ফাইলগুলি) দিয়ে কাজ করার অনুমতি দেয়।


1
+1 কারণ আপনি মেমরি-ম্যাপযুক্ত ফাইলগুলি যুক্ত করেছেন, আমার বর্তমান পড়া হিসাবে, অন্যান্য উত্তরগুলি ইতিমধ্যে সরবরাহ করা হয়েছে।
ernie.cordell

3

আলোচনা শেষ করার জন্য একটি নোট (আগ্রহী হলে) ....

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)?
মিহির

1

সিস্টেম কলগুলি বেশিরভাগই ফাইল বর্ণনাকারী ব্যবহার করে থাকে, উদাহরণস্বরূপ readএবং write। লাইব্রেরি ফাংশন ফাইল পয়েন্টার ( printf, scanf) ব্যবহার করবে । তবে, লাইব্রেরির ফাংশনগুলি কেবল অভ্যন্তরীণ সিস্টেম কলগুলি ব্যবহার করছে।


আমি নিশ্চিত না কেন আপনি কেন বলছেন যে লাইব্রেরির ফাংশনগুলি কেবলমাত্র অভ্যন্তরীণ সিস্টেম কলগুলি ব্যবহার করছে: আপনি যদি স্ট্যান্ডার্ড সিআই / ও (বা অন্য কোনও বিষয়) ফাংশনগুলি বোঝেন তবে আমি নিশ্চিত নই যে এটি (সর্বজনীন?) সত্য। অন্যথায়, আপনি যা বলেছিলেন তা নয়, তাই আমি আপনার পোস্টের ভাষাটি একটু পরিষ্কার করে দেখতে চাই। শেষ বাক্যটি আমাকে বিস্মিত করে।
ernie.cordell

1

আমি একটি ভাল রিসোর্চ বর্তমানে পাওয়া এখানে , দুই মধ্যে পার্থক্য উচ্চ পর্যায়ের ওভারভিউ দান:

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

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

স্ট্রিমগুলি একটি উচ্চ-স্তরের ইন্টারফেস সরবরাহ করে, আদিম ফাইল বর্ণনাকারী সুবিধার উপরে স্তরযুক্ত। স্ট্রিম ইন্টারফেস সব ধরণের ফাইলকে অনেক বেশি একইভাবে আচরণ করে — আপনি বেছে নিতে পারেন এমন তিনটি স্টাইল বাফারিংয়ের একমাত্র ব্যতিক্রম (স্ট্রিম বাফারিং দেখুন)।

স্ট্রিম ইন্টারফেসটি ব্যবহারের প্রধান সুবিধা হ'ল স্ট্রিমগুলিতে প্রকৃত ইনপুট এবং আউটপুট ক্রিয়াকলাপ সম্পাদনের জন্য ফাংশনগুলির সেট (ফাইল পরিচালনা করার জন্য সম্পর্কিত সুবিধাগুলির তুলনায় আরও সমৃদ্ধ এবং বেশি শক্তিশালী)। ফাইল বর্ণনাকারী ইন্টারফেস অক্ষরগুলির ব্লক স্থানান্তর করার জন্য কেবল সাধারণ ফাংশন সরবরাহ করে তবে স্ট্রিম ইন্টারফেসটি শক্তিশালী ফর্ম্যাটযুক্ত ইনপুট এবং আউটপুট ফাংশন (প্রিন্টফ এবং স্ক্যানফ) পাশাপাশি অক্ষর এবং লাইন-ভিত্তিক ইনপুট এবং আউটপুট সরবরাহ করে।

যেহেতু স্ট্রিমগুলি ফাইল বর্ণনাকারীদের ক্ষেত্রে কার্যকর করা হয়, আপনি একটি স্ট্রিম থেকে ফাইল বর্ণনাকারী আহরণ করতে পারেন এবং সরাসরি ফাইল বিবরণীতে নিম্ন-স্তরের ক্রিয়াকলাপ সম্পাদন করতে পারেন। আপনি প্রাথমিকভাবে কোনও ফাইল বর্ণনাকারী হিসাবে কোনও সংযোগ খুলতে পারেন এবং তারপরে সেই ফাইল বর্ণনাকারীর সাথে যুক্ত একটি স্ট্রিম তৈরি করতে পারেন।

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.