سؤال

أريد أن أعرف الفرق بين ملف واصف الملف ومؤشر الملفات.

أيضا، في أي سيناريو سوف تستخدم واحد بدلا من الآخر؟

هل كانت مفيدة؟

المحلول

واصف الملفات هو "مقبض" عدد صحيح منخفض المستوى المستخدم لتحديد ملف مفتوح (أو مأخذ توصيل، أو أيا كان) على مستوى kernel، في نظام Linux وغيرها من الأنظمة مثل UNIX.

يمكنك تمرير واصفات الملف "عارية" إلى مكالمات UNIX الفعلية، مثل اقرأ(), اكتب() وهلم جرا.

أ FILE المؤشر هو بناء جي مستوى مكتبة قياسي، يستخدم لتمثيل ملف. ال FILE يلف واصف الملفات، ويضيف التخزين المؤقت وغيرها من الميزات لجعل I / o أسهل.

أنت تمر FILE المؤشرات إلى وظائف C القياسية مثل fraeb () و fwrite ().

نصائح أخرى

واحد مخزن مؤقتا (FILE *) والآخر ليس كذلك. في الممارسة العملية، تريد استخدامها FILE * دائما دائما عندما تقرأ من ملف "حقيقي" (أي. على محرك الأقراص)، إلا إذا كنت تعرف ما الذي تقوم به أو ما لم يكن الملف الخاص بك بالفعل مقبس أو نحو ذلك ..

يمكنك الحصول على واصف الملف من FILE * استخدام fileno() ويمكنك فتح مخزنة FILE * من واصف الملفات باستخدام fdopen()

واصف الملف هو مجرد عدد صحيح تحصل عليه من بوسيكس " open()يتصل. باستخدام القياسية C fopen() تحصل على FILE بنية الظهر. ال FILE يحتوي الهيكل على واصف الملف هذا من بين أشياء أخرى مثل مؤشر نهاية الملف والخطأ، وظيفة الدفق، إلخ.

لذلك استخدام fopen() يمنحك قدرا معينا من التجريد مقارنة open(). وبعد بشكل عام يجب أن تستخدم fopen() نظرا لأن هذا هو أكثر محمولة ويمكنك استخدام جميع وظائف C القياسية الأخرى التي تستخدم FILE بنية، أي fprintf() والأسرة.

لا توجد مشاكل في الأداء باستخدام إما أو.

ملف واصف vs مؤشر الملف

واصف الملف:

ملف واصف هو قيمة عدد صحيح عاد من قبل open() مكالمة النظام.

int fd = open (filePath, mode);

  1. معالج مستوى منخفض / نواة.
  2. Passe لقراءة () وكتابة () من مكالمات نظام UNIX.
  3. لا يشمل التخزين المؤقت وميزات هذه الميزات.
  4. أقل المحمولة وتفتقر إلى الكفاءة.

مؤشر الملفات:

مؤشر الملفات هو مؤشر إلى هيكل C عاد من قبل fopen() وظيفة المكتبة، والتي تستخدم ل تحديد ملف، وتفويل واصف الملفات، ووظائف التخزين المؤقت وجميع الوظائف الأخرى اللازمة لعملية الإدخال / الإخراجمؤشر الملفات من النوع ملف, ، الذي يمكن العثور على تعريف في "/usr/include/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. مرت إلى وظائف FREED () و FWRITE ().
  3. يتضمن التخزين المؤقت، إشارة الخطأ والكشف عن EOF، إلخ.
  4. يوفر قدرات أعلى وكفاءة.

تريد إضافة نقاط قد تكون مفيدة.

حول FILE *

  1. لا يمكن استخدامها للاتصالات النصية (IPC).
  2. استخدمه عندما تحتاج إلى الغرض Genral مخزنا بإدخال / س. (printf، frpinf، snprintf، scanf)
  3. أنا استخدمه عدة مرات لسجلات التصحيح. مثال،

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

حول FILE DESCRIPTOR

  1. يستخدم عموما ل IPC.

  2. يعطي تحكم منخفض المستوى إلى الملفات على أنظمة * Nix. (الأجهزة، الملفات، المقابس، إلخ)، وبالتالي أكثر قوة أكثر من FILE *.

FILE * هو أكثر فائدة عند العمل مع الملفات النصية وإدخال المستخدم / الإخراج، لأنه يسمح لك باستخدام وظائف API مثل sprintf(), sscanf(), fgets(), feof() إلخ.

ملف واصف الملف هو مستوى منخفض، لذلك يسمح للعمل مع مآخذ، الأنابيب، الملفات المعينة بالذاكرة (والملفات العادية، بالطبع).

مجرد ملاحظة لإنهاء المناقشة (إذا كانت مهتمة) ....

fopen يمكن أن تكون غير آمنة، وربما يجب عليك استخدامها fopen_s أو open مع مجموعة أجزاء حصرية. C1X تقدم x أوضاع، حتى تتمكن من ذلك fopen مع أوضاع "rx", "wx", ، إلخ.

إذا كنت تستخدم open, ، قد تفكر open(..., O_EXCL | O_RDONLY,... ) أو open(..., O_CREAT | O_EXCL | O_WRONLY,... ).

انظر، على سبيل المثال، لا تصدر افتراضات حول FOPEN () وإنشاء الملف.

مكالمات النظام تستخدم في الغالب واصف الملف، على سبيل المثال read و write. وبعد وظيفة المكتبة ستستخدم مؤشرات الملفات ( printf , scanf). ولكن، تستخدم وظائف المكتبة مكالمات نظام داخليا فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top