إدخال/إخراج ملفات C
توفر لغة البرمجة C العديد من وظائف المكتبة القياسية لإدخال وإخراج الملفات . تشكل هذه الوظائف الجزء الأكبر من ملف رأس المكتبة القياسية C < stdio.h > . [ 1 ] تعود هذه الوظائف إلى "حزمة إدخال/إخراج محمولة" كتبها مايك ليسك في مختبرات بيل في أوائل سبعينيات القرن الماضي، [ 2 ] وأصبحت رسميًا جزءًا من نظام التشغيل يونكس في الإصدار 7. [ 3 ]
تُعتبر وظائف الإدخال والإخراج في لغة C منخفضة المستوى نسبيًا وفقًا للمعايير الحديثة؛ إذ تُجرّد C جميع عمليات الملفات إلى عمليات على تدفقات من البايتات ، والتي قد تكون "تدفقات إدخال" أو "تدفقات إخراج". وعلى عكس بعض لغات البرمجة السابقة، لا تدعم C بشكل مباشر ملفات البيانات ذات الوصول العشوائي ؛ لقراءة سجل من منتصف ملف، يجب على المبرمج إنشاء تدفق، والبحث عن منتصف الملف، ثم قراءة البايتات بالتسلسل من هذا التدفق.
انتشر نموذج التدفق في عمليات إدخال/إخراج الملفات بفضل نظام يونكس، الذي طُوّر بالتزامن مع لغة البرمجة سي. وقد ورثت الغالبية العظمى من أنظمة التشغيل الحديثة التدفقات من يونكس، كما ورثت العديد من لغات عائلة سي واجهة إدخال/إخراج الملفات الخاصة بها مع تغييرات طفيفة إن وُجدت (على سبيل المثال، لغة PHP ).
ملخص
تستخدم هذه المكتبة ما يُسمى بالتدفقات للتعامل مع الأجهزة المادية مثل لوحات المفاتيح والطابعات والمحطات الطرفية، أو مع أي نوع آخر من الملفات التي يدعمها النظام. تُعدّ التدفقات تجريدًا للتفاعل مع هذه الأجهزة بطريقة موحدة. تتمتع جميع التدفقات بخصائص متشابهة بغض النظر عن الخصائص الفردية للوسائط المادية المرتبطة بها. [ 4 ]
الوظائف
يتم تعريف معظم وظائف الإدخال/الإخراج لملفات C في <stdio.h>(أو في رأس C++<cstdio> ، الذي يحتوي على وظائف C القياسية ولكن في مساحة الاسم std ).
| حرف البايت | شخصية واسعة | وصف | |
|---|---|---|---|
| الوصول إلى الملفات | فتح | يفتح ملفًا (باسم ملف غير متوافق مع Unicode على نظام Windows، وربما باسم ملف متوافق مع UTF-8 على نظام Linux) | |
| بوبين | يفتح عملية عن طريق إنشاء قناة، ثم إنشاء عملية فرعية، ثم استدعاء الصدفة. | ||
| إعادة فتح | يفتح ملفًا مختلفًا باستخدام دفق موجود | ||
| تدفق | يقوم بمزامنة دفق الإخراج مع الملف الفعلي | ||
| fclose | يغلق الملف | ||
| إغلاق | يغلق مجرى البيانات | ||
| setbuf | يقوم بتعيين المخزن المؤقت لتدفق الملف | ||
| setvbuf | يحدد المخزن المؤقت وحجمه لتدفق الملفات | ||
| واسع | يقوم هذا الأمر بتبديل تدفق الملفات بين الإدخال/الإخراج ذي الأحرف العريضة والإدخال/الإخراج ذي الأحرف الضيقة | ||
| الإدخال/الإخراج المباشر | اقرأ | يقرأ من ملف | |
| fwrite | يكتب إلى ملف | ||
| مدخلات/مخرجات غير منسقة | fgetc getc | fgetwc getwc | يقرأ بايت/ wchar_t من دفق ملف |
| fgets | fgetws | يقرأ سطرًا من نوع بايت/ wchar_t من دفق ملف | |
| fputc putc | fputwc putwc | يكتب بايت/ wchar_t إلى دفق ملف | |
| fputs | fputws | يكتب سلسلة بايت/ wchar_t إلى دفق ملف | |
| getchar | getwchar | يقرأ بايت/ wchar_t من الإدخال القياسي | |
| غير متوفر | يقرأ سلسلة بايت من المدخلات القياسية حتى يتم مصادفة سطر جديد أو نهاية الملف (تم إهماله في C99، وتمت إزالته من C11) | ||
| بوتشار | putwchar | يكتب بايت/ wchar_t إلى الإخراج القياسي (stdout). | |
| يضع | غير متوفر | يكتب سلسلة بايتات إلى الإخراج القياسي (stdout). | |
| ungect | ungetwc | يعيد بايت/ wchar_t إلى دفق الملف | |
| إدخال/إخراج منسق | scanf fscanf sscanf | wscanf fwscanf swscanf | يقرأ مدخلات منسقة من نوع بايت/ wchar_t من stdin أو دفق ملف أو مخزن مؤقت |
| vscanf vfscanf vsscanf | vwscanf vfwscanf vswscanf | يقرأ المدخلات المنسقة من نوع بايت/ wchar_t من الإدخال القياسي، أو دفق ملف، أو مخزن مؤقت باستخدام قائمة وسيطات متغيرة | |
| printf fprintf sprintf snprintf | wprintf fwprintf swprintf | يطبع مخرجات بايت/ wchar_t المنسقة إلى stdout أو دفق ملف أو مخزن مؤقت | |
| vprintf vfprintf vsprintf vsnprintf | vwprintf vfwprintf vswprintf | يطبع مخرجات منسقة من نوع بايت/ wchar_t إلى الإخراج القياسي، أو دفق ملف، أو مخزن مؤقت باستخدام قائمة وسيطات متغيرة | |
| خطأ | غير متوفر | يكتب وصفًا للخطأ الحالي إلى الخطأ القياسي (stderr). | |
| تحديد موضع الملف | فتيل فتيلو | يُعيد مؤشر موضع الملف الحالي | |
| fseek fseeko | ينقل مؤشر موضع الملف إلى موقع محدد في الملف | ||
| fgetpos | يحصل على مؤشر موضع الملف | ||
| fsetpos | ينقل مؤشر موضع الملف إلى موقع محدد في الملف | ||
| إعادة تشغيل | ينقل مؤشر موضع الملف إلى بداية الملف | ||
| معالجة الأخطاء | أوضح | يزيل الأخطاء | |
| feof | التحقق من نهاية الملف | ||
| خطأ | التحقق من وجود خطأ في الملف | ||
| العمليات على الملفات | يزيل | يمسح ملفًا | |
| إعادة تسمية | إعادة تسمية ملف | ||
| ملف مؤقت | يُعيد مؤشرًا إلى ملف مؤقت | ||
| tmpnam | يُرجع اسم ملف فريد | ||
الثوابت
تتضمن الثوابت المحددة في <stdio.h>ملف الرأس ما يلي:
| اسم | ملحوظات |
|---|---|
| نهاية الملف | عدد صحيح سالب من النوع int يُستخدم للإشارة إلى شروط نهاية الملف |
| بوفسايز | عدد صحيح يمثل حجم المخزن المؤقت الذي تستخدمه الدالة setbuf() |
| الحد الأقصى لاسم الملف | حجم مصفوفة الأحرف التي تكون كبيرة بما يكفي لتخزين اسم أي ملف يمكن فتحه |
| FOPIN_MAX | عدد الملفات التي يمكن فتحها في وقت واحد؛ سيكون ثمانية على الأقل |
| _IOFBF | اختصار لعبارة "مُخزَّن مؤقتًا بالكامل للإدخال/الإخراج"؛ وهو عدد صحيح يمكن تمريره إلى الدالة setvbuf() لطلب تخزين الإدخال والإخراج مؤقتًا على مستوى الكتل لتدفق مفتوح |
| _IOLBF | اختصار لعبارة "input/output line buffered"؛ وهو عدد صحيح يمكن تمريره إلى الدالة setvbuf() لطلب تخزين الإدخال والإخراج مؤقتًا على مستوى السطر لتدفق مفتوح. |
| _IONBF | اختصار لعبارة "إدخال/إخراج غير مُخزَّن مؤقتًا"؛ وهو عدد صحيح يُمكن تمريره إلى الدالة setvbuf() لطلب إدخال وإخراج غير مُخزَّن مؤقتًا لتدفق مفتوح |
| L_tmpnam | حجم مصفوفة الأحرف الكبيرة بما يكفي لتخزين اسم ملف مؤقت يتم إنشاؤه بواسطة الدالة tmpnam() |
| باطل | ماكرو يتوسع إلى ثابت المؤشر الفارغ ؛ أي ثابت يمثل قيمة مؤشر مضمونة بأنها ليست عنوانًا صالحًا لكائن في الذاكرة |
| SEEK_CUR | عدد صحيح يمكن تمريره إلى دالة fseek() لطلب تحديد الموضع بالنسبة إلى موضع الملف الحالي |
| SEEK_END | عدد صحيح يمكن تمريره إلى دالة fseek() لطلب تحديد الموضع بالنسبة إلى نهاية الملف |
| SEEK_SET | عدد صحيح يمكن تمريره إلى دالة fseek() لطلب تحديد الموضع بالنسبة لبداية الملف |
| TMP_MAX | الحد الأقصى لعدد أسماء الملفات الفريدة التي يمكن إنشاؤها بواسطة الدالة tmpnam() هو 25 على الأقل |
المتغيرات

<stdio.h>تتضمن المتغيرات المحددة في رأس الملف ما يلي:
| اسم | ملحوظات |
|---|---|
| stdin | مؤشر إلى ملف يشير إلى دفق الإدخال القياسي، وعادة ما يكون لوحة مفاتيح. |
| stdout | مؤشر إلى ملف يشير إلى دفق الإخراج القياسي، وعادة ما يكون طرفية عرض. |
| stderr | مؤشر إلى ملف يشير إلى دفق الخطأ القياسي، وغالبًا ما يكون طرفية عرض. |
أنواع الأعضاء
تشمل أنواع البيانات المحددة في <stdio.h>الترويسة ما يلي:
- ملف – يُعرف أيضًا باسممقبض الملف أومؤشر الملف ، وهومؤشر مبهميحتوي على المعلومات المتعلقة بملف أو دفق نصي اللازمة لإجراء عمليات الإدخال أو الإخراج عليه، بما في ذلك:
- معرّف خاص بالمنصة لجهاز الإدخال/الإخراج المرتبط، مثل واصف الملف
- المخزن المؤقت
- مؤشر اتجاه التيار (غير مضبوط، ضيق، أو واسع)
- مؤشر حالة تخزين البيانات في التدفق (غير مخزن مؤقتًا، مخزن مؤقتًا على مستوى السطر، مخزن مؤقتًا بالكامل)
- مؤشر وضع الإدخال/الإخراج (تدفق الإدخال، أو تدفق الإخراج، أو تدفق التحديث)
- مؤشر وضع النص/الثنائي
- مؤشر نهاية الملف
- مؤشر الخطأ
- موضع التدفق الحالي وحالة تحويل البايتات المتعددة (كائن من النوع
mbstate_t) - قفل قابل لإعادة الدخول (مطلوب اعتبارًا من الإصدار C11 )
fpos_t– نوع غير مصفوفي قادر على تحديد موضع كل بايت في الملف بشكل فريد، وكل حالة تحويل يمكن أن تحدث في جميع ترميزات الأحرف متعددة البايتات المدعومة.size_t– نوع عدد صحيح غير موقع وهو نوع نتيجة عامل sizeof .
الإضافات
يُعرّف معيار POSIX العديد من الامتدادات <stdio.h>في تعريفاته الأساسية، من بينها readlineدالة لتخصيص الذاكرة، filenoودالتان fdopenتُنشئان الرابط بين كائنات FILE ومُعرّفات الملفات ، ومجموعة من الدوال لإنشاء كائنات تُشير إلى مخازن مؤقتة في الذاكرة. [ 5 ]FILE
مثال
يقوم برنامج C التالي بفتح ملف ثنائي يسمى myfile.bin ، ويقرأ خمسة بايتات منه، ثم يغلق الملف.
#include <stdio.h> #include <stdlib.h>int main ( void ) { const char file_name [] = "myfile.bin" ;char buffer [ 5 ]; FILE * fp = fopen ( file_name , "rb" );إذا كان ( fp == NULL ) { fprintf ( stderr , "فشل فتح الملف " %s " ! \n " , file_name ); return EXIT_FAILURE ; }size_t len = fread ( buffer , 1 , sizeof buffer , fp ); if ( len < sizeof buffer ) { if ( ferror ( fp )) { fprintf ( stderr , "خطأ في القراءة في " %s \"\n " , file_name ); } else if ( feof ( fp )) { fprintf ( stderr , "نهاية غير متوقعة للملف في " %s \"\n " , file_name ); } fclose ( fp ); return EXIT_FAILURE ; }fclose ( fp );printf ( "عدد البايتات المقروءة هو: " ); for ( size_t i = 0 ; i < len ; ++ i ) { printf ( "%02X " , ( unsigned char ) buffer [ i ]); } putchar ( '\n' );return EXIT_SUCCESS ; }بدائل للاستوديو
تم تطوير العديد من البدائل <stdio.h>. من بينها رؤوس الإدخال /الإخراج في لغة C++<iostream> ، وهي <print>جزء من مكتبة C++ القياسية . لا يزال معيار ISO C++ يتطلب هذه <stdio.h>الوظيفة، وهي موجودة ضمن رأس <cstdio>.
من البدائل الأخرى مكتبة Sfio [ 6 ] (مكتبة إدخال/إخراج آمنة/سريعة) من مختبرات AT&T Bell . تهدف هذه المكتبة، التي طُرحت عام 1991، إلى تجنب التناقضات والممارسات غير الآمنة وعدم الكفاءة في تصميمها <stdio.h>. ومن بين ميزاتها إمكانية إدراج دوال رد نداء في دفق البيانات لتخصيص معالجة البيانات المقروءة منه أو المكتوبة إليه. [ 7 ] [ 8 ] أُتيحت المكتبة للجمهور عام 1997، وكان آخر إصدار رسمي مستقر لها في 1 فبراير 2005. [ 9 ] [ 10 ] [ 11 ]
انظر أيضاً
مراجع
- ↑ مواصفات ISO/IEC 9899:1999 . ص 274، § 7.19.
- ↑ كيرنيغان، برايان ؛ بايك، روب (1984). بيئة برمجة يونكس . إنجلوود كليفس : برنتيس هول . ص 200. Bibcode : 1984upe..book.....K .
- ↑ ماكيلروي، دكتور في الطب (1987). قارئ أبحاث يونكس: مقتطفات مشروحة من دليل المبرمج، 1971-1986 (ملف PDF) (تقرير فني). مختبرات بيل. 139.
- ↑ "(stdio.h) - مرجع C++" . C++ . تم الاطلاع عليه بتاريخ 25 يوليو 2021 .
- ↑ – مرجع تعريفات القواعد، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- ↑ "Sfio: مكتبة إدخال/إخراج آمنة/سريعة" . مؤرشف من الأصل في 11 فبراير 2006. تم الاطلاع عليه في 16 مارس 2021 .
{{cite web}}: CS1 maint: bot: حالة عنوان URL الأصلي غير معروفة ( رابط ) - ↑ كورن، ديفيد ج .؛ فو، كيم-فونغ (1991). SFIO: إدخال/إخراج آمن/سريع للسلاسل/الملفات . وقائع مؤتمر USENIX الصيفي. CiteSeerX 10.1.1.51.6574 .
- ↑ فاولر، جلين س.؛ كورن، ديفيد ج.؛ فو، كيم-فونغ (2000). التنسيق الموسع باستخدام Sfio . وقائع مؤتمر USENIX الصيفي.
- ↑ "قائمة حزم تنزيل برامج sfio" . مؤرشفة من الأصل بتاريخ 19 يناير 2012. تم الاطلاع عليها بتاريخ 17 يناير 2026 .
{{cite web}}: CS1 maint: bot: حالة عنوان URL الأصلي غير معروفة ( رابط ) - ↑ sfio-2005-02-01
- ↑ sfio-AST-2012-08-01
روابط خارجية
الوسائط المتعلقة بإدخال/إخراج ملفات لغة C على ويكيميديا كومنز
- مكتبة C القياسية
- المدخلات/المخرجات
