ما الفرق بين ملف واصف الملف ومؤشر الملفات؟
-
19-09-2019 - |
سؤال
أريد أن أعرف الفرق بين ملف واصف الملف ومؤشر الملفات.
أيضا، في أي سيناريو سوف تستخدم واحد بدلا من الآخر؟
المحلول
واصف الملفات هو "مقبض" عدد صحيح منخفض المستوى المستخدم لتحديد ملف مفتوح (أو مأخذ توصيل، أو أيا كان) على مستوى 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);
- معالج مستوى منخفض / نواة.
- Passe لقراءة () وكتابة () من مكالمات نظام UNIX.
- لا يشمل التخزين المؤقت وميزات هذه الميزات.
- أقل المحمولة وتفتقر إلى الكفاءة.
مؤشر الملفات:
مؤشر الملفات هو مؤشر إلى هيكل 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;
- انها واجهة عالية المستوى.
- مرت إلى وظائف FREED () و FWRITE ().
- يتضمن التخزين المؤقت، إشارة الخطأ والكشف عن EOF، إلخ.
- يوفر قدرات أعلى وكفاءة.
تريد إضافة نقاط قد تكون مفيدة.
حول FILE *
- لا يمكن استخدامها للاتصالات النصية (IPC).
- استخدمه عندما تحتاج إلى الغرض Genral مخزنا بإدخال / س. (printf، frpinf، snprintf، scanf)
أنا استخدمه عدة مرات لسجلات التصحيح. مثال،
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
حول FILE DESCRIPTOR
يستخدم عموما ل IPC.
يعطي تحكم منخفض المستوى إلى الملفات على أنظمة * 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
). ولكن، تستخدم وظائف المكتبة مكالمات نظام داخليا فقط.