إدخال/إخراج ملفات 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 getcfgetwc getwcيقرأ بايت/ wchar_t من دفق ملف
fgetsfgetwsيقرأ سطرًا من نوع بايت/ wchar_t من دفق ملف
fputc putcfputwc putwcيكتب بايت/ wchar_t إلى دفق ملف
fputsfputwsيكتب سلسلة بايت/ wchar_t إلى دفق ملف
getchargetwcharيقرأ بايت/ wchar_t من الإدخال القياسي
يحصلغير متوفريقرأ سلسلة بايت من المدخلات القياسية حتى يتم مصادفة سطر جديد أو نهاية الملف (تم إهماله في C99، وتمت إزالته من C11)
بوتشارputwcharيكتب بايت/ wchar_t إلى الإخراج القياسي (stdout).
يضعغير متوفريكتب سلسلة بايتات إلى الإخراج القياسي (stdout).
ungectungetwcيعيد بايت/ wchar_t إلى دفق الملف
إدخال/إخراج منسقscanf fscanf sscanfwscanf fwscanf swscanfيقرأ مدخلات منسقة من نوع بايت/ wchar_t من stdin أو دفق ملف أو مخزن مؤقت
vscanf vfscanf vsscanfvwscanf vfwscanf vswscanfيقرأ المدخلات المنسقة من نوع بايت/ wchar_t من الإدخال القياسي، أو دفق ملف، أو مخزن مؤقت باستخدام قائمة وسيطات متغيرة
printf fprintf sprintf snprintfwprintf fwprintf swprintfيطبع مخرجات بايت/ wchar_t المنسقة إلى stdout أو دفق ملف أو مخزن مؤقت
vprintf vfprintf vsprintf vsnprintfvwprintf 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 ]

انظر أيضاً

مراجع

  1. مواصفات ISO/IEC 9899:1999 . ص 274، § 7.19.
  2. كيرنيغان، برايان ؛ بايك، روب (1984). بيئة برمجة يونكس . إنجلوود كليفس : برنتيس هول . ص 200. Bibcode : 1984upe..book.....K . 
  3. ماكيلروي، دكتور في الطب (1987). قارئ أبحاث يونكس: مقتطفات مشروحة من دليل المبرمج، 1971-1986 (ملف PDF) (تقرير فني). مختبرات بيل. 139.
  4. "(stdio.h) - مرجع C++" . C++ . تم الاطلاع عليه بتاريخ 25 يوليو 2021 .
  5. مرجع تعريفات القواعد، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Groupstdio.h  
  6. "Sfio: مكتبة إدخال/إخراج آمنة/سريعة" . مؤرشف من الأصل في 11 فبراير 2006. تم الاطلاع عليه في 16 مارس 2021 .{{cite web}}: CS1 maint: bot: حالة عنوان URL الأصلي غير معروفة ( رابط )
  7. كورن، ديفيد ج .؛ فو، كيم-فونغ (1991). SFIO: إدخال/إخراج آمن/سريع للسلاسل/الملفات . وقائع مؤتمر USENIX الصيفي. CiteSeerX 10.1.1.51.6574 . 
  8. فاولر، جلين س.؛ كورن، ديفيد ج.؛ فو، كيم-فونغ (2000). التنسيق الموسع باستخدام Sfio . وقائع مؤتمر USENIX الصيفي.
  9. "قائمة حزم تنزيل برامج sfio" . مؤرشفة من الأصل بتاريخ 19 يناير 2012. تم الاطلاع عليها بتاريخ 17 يناير 2026 .{{cite web}}: CS1 maint: bot: حالة عنوان URL الأصلي غير معروفة ( رابط )
  10. sfio-2005-02-01
  11. sfio-AST-2012-08-01
  • شعار ويكيميديا ​​كومنزالوسائط المتعلقة بإدخال/إخراج ملفات لغة C على ويكيميديا ​​كومنز