سؤال

هل هناك أي سبب (بخلاف العناصر الأساسية) التي تريد استخدامها

FILE *fdopen(int fd, const char *mode);

أو

FILE *fopen(const char *path, const char *mode);

بدلا من

int open(const char *pathname, int flags, mode_t mode);

عند استخدام C في بيئة Linux؟

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

المحلول

أولا، لا يوجد سبب وجيه بشكل خاص للاستخدام fdopen إذا fopen هو خيار و open هو الخيار الآخر ممكن. يجب أن لا تستخدم open لفتح الملف في المقام الأول إذا كنت تريد FILE *. وبعد لذلك بما في ذلك fdopen في تلك القائمة غير صحيحة ومربكة لأنه ليس كثيرا مثل الآخرين. سأنتقل الآن إلى تجاهله لأن التمييز الهام هنا بين معيار C FILE * واصف الملفات الخاصة بنظام التشغيل.

هناك أربعة أسباب رئيسية للاستخدام fopen بدلا من open.

  1. fopen يوفر لك التخزين المؤقت IO قد يكون أسرع بكثير مما كنت تفعله open.
  2. fopen هل خط النهاية الترجمة إذا لم يتم فتح الملف في الوضع الثنائي، والذي قد يكون مفيدا للغاية إذا كان برنامجك يستند إلى بيئة غير متطابقة.
  3. أ FILE * يمنحك القدرة على الاستخدام fscanf وظائف Stdio الأخرى.
  4. قد تحتاج التعليمات البرمجية الخاصة بك إلى جانب منصة أخرى تدعم فقط ANSI C ولا تدعم open وظيفة.

في رأيي أن الترجمة المنتهية في الخط غالبا ما تحصل في طريقك مما يساعدك، وتحليل fscanf هو ضعيف جدا لأنك تنتهي حتما في إلقائه لصالح شيء أكثر فائدة.

ومعظم المنصات التي تدعم C لديها open وظيفة.

هذا يترك السؤال التخزين المؤقت. في الأماكن التي تقوم فيها بشكل أساسي بقراءة أو كتابة ملف بالتتابع، فإن الدعم التخزين المؤقت مفيد حقا وتحسين السرعة الكبيرة. ولكن يمكن أن يؤدي إلى بعض المشاكل المثيرة للاهتمام التي لا تنتهي فيها البيانات في الملف عندما تتوقع أن تكون هناك. عليك أن تتذكر fclose أو fflush في الأوقات المناسبة.

إذا كنت تفعل تسعى (ويعرف أيضا باسم fsetpos أو fseek والثاني الأكثر صعوبة قليلا للاستخدام بطريقة متوافقة مع المعايير)، فإن فائدة التخزين المؤقت تنخفض بسرعة.

بالطبع، التحيز الخاص بي هو أنني أميل إلى العمل مع مآخذ مجموعة كاملة، وهناك حقيقة أنك تريد حقا أن تفعل IO غير حظر (والتي FILE * فشل تماما في الدعم بأي طريقة معقولة) مع عدم وجود تخزين مؤقت على الإطلاق، وغالبا ما يكون لها متطلبات تحليل معقدة حقا تصوراتي.

نصائح أخرى

open() هو مكالمة نظام التشغيل منخفضة المستوى. fdopen() يحول واصف الملفات على مستوى نظام التشغيل إلى إدراج الملفات ذات المستوى الأعلى للغة C. fopen() المكالمات open() في الخلفية ويعطيك مؤشر ملفات مباشرة.

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

fopen vs مفتوحة في ج

1) fopen هو وظيفة المكتبة في حين open هو دعوة النظام.

2) fopen تقدم مخززين io. وهو مقارنة أسرع ل open الذي غير مخزنة.

3) fopen يكون المحمولة في حين open ليس المحمولة (فتح هو بيئة محددة).

4) fopen إرجاع مؤشر إلى بنية الملف (ملف *); open إرجاع عدد صحيح يحدد الملف.

5) أ. FILE * يمنحك القدرة على الاستخدام FSCANF. وظائف Stdio الأخرى.

اذا كان لديك FILE *, ، يمكنك استخدام وظائف مثل fscanf, fprintf و fgets إلخ. إذا كان لديك فقط واصف الملفات، لديك إجراءات إخراج وإخراج إخراج محدودة (ولكن من المرجح) read, write إلخ.

ما لم تكن جزءا من 0.1٪ من التطبيقات التي تستخدمها open هو فائدة الأداء الفعلية، ليس هناك سبب وجيه لعدم استخدامه fopen. وبعد بقدر ما أو إلى هذا الحد fdopen تشعر بالقلق، إذا كنت لا تلعب مع واصفات الملفات، فلن تحتاج إلى هذه المكالمة.

العصا مع fopen وعائلتها من الأساليب (fwrite, fread, fprintf, ، وآخرون) وستكون راضيا للغاية. بنفس القدر، فإن المبرمجين الآخرين سوف يكونوا راضين عن التعليمات البرمجية الخاصة بك.

باستخدام فتح، القراءة، والكتابة يعني أن عليك أن تقلق بشأن التفويضات الإشارات.

إذا تمت مقاطعة المكالمة بواسطة معالج إشارة، فسوف ترجع الوظائف -1 وتعيين errno إلى eintr.

وبالتالي فإن الطريقة المناسبة لإغلاق الملف ستكون

while (retval = close(fd), retval == -1 && ernno == EINTR) ;

افتح() سيتم استدعاء في نهاية كل من FOPEN () وظائف الأسرة. افتح() هو مكالمة النظام و FOPEN () يتم توفيرها بواسطة المكتبات كوظائف غلاف للمستخدم سهل الاستخدام

open() هو مكالمة نظام ومحددة لأنظمة المستندة إلى UNIX وإرجاع واصف الملفات. يمكنك الكتابة إلى واصف الملفات باستخدام write() وهو مكالمة نظام أخرى.
fopen() هي دعوة وظيفة ANSI C التي ترجع مؤشر ملف ومحمولة إلى أنظمة تشغيل أخرى. يمكننا الكتابة إلى مؤشر الملفات باستخدام fprintf.

في يونيكس:
يمكنك الحصول على مؤشر ملف من واصف الملف باستخدام:

fP = fdopen(fD, "a");

يمكنك الحصول على واصف ملف من مؤشر الملفات باستخدام:

fD = fileno (fP);

يعتمد أيضا على ما يلزم فتح الأعلام. فيما يتعلق بالاستخدام للكتابة والقراءة (والقابلية) يجب استخدام F *، كما جادل أعلاه.

ولكن إذا كنت ترغب أساسا في تحديد أكثر من الأعلام القياسية (مثل إشارات RW و Append)، فسيتعين عليك استخدام API منصة محددة (مثل Posix Open) أو مكتبة تقوم بتخصص هذه التفاصيل. C-Standard ليس لديه أي أعلام من هذا القبيل.

على سبيل المثال، قد ترغب في فتح ملف، فقط إذا انتهى الأمر. إذا لم تحدد إنشاء علامة إنشاء يجب أن يكون الملف موجودا. إذا قمت بإضافة حصرية لإنشاءها، فستكون فقط إنشاء الملف إذا لم يكن موجودا. هناك أكثر من ذلك بكثير.

على سبيل المثال على أنظمة Linux، هناك واجهة LED مكشوفة من خلال SYSFS. إنه يكشف سطوع الصمام من خلال ملف. كتابة أو قراءة عدد كسلسلة تتراوح بين 0-255. بالطبع لا تريد إنشاء هذا الملف والكتابة إليه فقط إذا كان موجودا. الشيء الرائع الآن: استخدم FDOPEN لقراءة / كتابة هذا الملف باستخدام المكالمات القياسية.

لقد غيرت إلى فتح () من FOPEN () للتطبيق الخاص بي، لأن FOPEN كان يسبب قراءات مزدوجة في كل مرة ركض فيها FOPEN FGETC. قراءات مزدوجة كانت تخريبية لما كنت أحاول إنجازه. مفتوح () يبدو أن تفعل ما تسأل عنه.

فتح ملف باستخدام فوبين
قبل أن نتمكن من قراءة (أو الكتابة) معلومات من (إلى) ملف على قرص يجب أن نفتح الملف. لفتح الملف الذي اتصلنا به وظيفة FOPEN.

1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.

هذه هي طريقة سلوك فوبين وظيفة
هناك بعض الأسباب أثناء عملية التخزين المؤقت، قد يتم تشغيله. لذلك أثناء مقارنة فوبين(مستوى عال I / O) إلى افتح (منخفض المستوى I / O) مكالمة النظام، وهو أسرع أكثر ملاءمة من فوبين.

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