في عالم برمجة C، تعد إدارة المدخلات والمخرجات والذاكرة بشكل فعال أمرًا أساسيًا. لمساعدتك في فهم هذه المفاهيم الهامة، get_next_line هو مشروع حيث ستكتب دالة تقرأ سطرًا تلو الآخر من الملف باستخدام واصف الملف. يقرأ كل استدعاء للوظيفة السطر التالي من الملف، مما يسمح لك بمعالجة محتوى الملف بأكمله سطرًا تلو الآخر.
واصف الملف هو عدد صحيح غير سالب يحدد بشكل فريد الملف المفتوح في النظام. عندما يفتح برنامج ملفًا، يقوم نظام التشغيل بإرجاع واصف ملف يمكن استخدامه للإشارة إلى هذا الملف في العمليات اللاحقة، مثل قراءة الملف أو كتابته أو إغلاقه. واصفات الملفات هي عبارة عن تجريد يستخدمه نظام التشغيل لإدارة موارد الإدخال/الإخراج المتنوعة، بما في ذلك الملفات والمقابس والأنابيب.
0، 1، و2 (الإدخال القياسي، والإخراج القياسي، والخطأ القياسي) في العملية أ مستقلة ومنفصلة عن واصفات الملف في العملية ب. ويضمن هذا العزل أن عمليات الملف في عملية واحدة لا تتداخل مع تلك الموجودة في العملية. آخر.
يرتبط كل واصف ملف بإدخال جدول واصف الملف الذي يحتوي على معلومات أساسية حول الملف. يتضمن ذلك مسار الملف، وأذونات الوصول، والإزاحة الحالية، التي تتتبع الموضع داخل الملف لعمليات القراءة/الكتابة. تسمح هذه البنية لنظام التشغيل بإدارة ملفات مفتوحة متعددة بكفاءة وضمان الوصول الصحيح ومعالجة البيانات.
لاحظ أن واصفات الملفات 0 و1 و2 محجوزة بواسطة نظام التشغيل للتدفقات القياسية. يتم استخدام واصف الملف 0 للإدخال القياسي (stdin)، والذي يمثل عادةً الإدخال من لوحة المفاتيح. يتم استخدام واصف الملف 1 للإخراج القياسي (stdout)، والذي يمثل الإخراج إلى الشاشة أو الوحدة الطرفية. يتم استخدام واصف الملف 2 للخطأ القياسي (stderr)، والذي يمثل أيضًا الإخراج إلى الشاشة أو الوحدة الطرفية ولكنه مخصص خصيصًا لرسائل الخطأ. تضمن واصفات الملفات المحجوزة إمكانية إدارة عمليات الإدخال والإخراج الأساسية بشكل متسق عبر البرامج والبيئات المختلفة. أي واصف ملف يتم إرجاعه بواسطة الدالة المفتوحة سيكون 3 أو أعلى، مما يضمن عدم تعارضه مع هذه التدفقات القياسية.
'#include
'
'#include' int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
يتم الحصول على واصف الملف، الذي يتم تمثيله كعدد صحيح، باستخدام الوظيفة المفتوحة، والتي تأخذ معلمتين: اسم الملف (أو المسار) والأعلام التي تحدد أذونات الوصول إلى الملف. على سبيل المثال، لقراءة محتوى ملف، نستخدم علامة O_RDONLY (للقراءة فقط). للقراءة والكتابة، نستخدم علامة O_RDWR. على الرغم من توفر العديد من العلامات، إلا أننا سنستخدم O_RDONLY فقط لهذا المشروع. تقوم الدالة المفتوحة بإرجاع عدد صحيح غير سالب، وهو واصف الملف إذا كانت العملية ناجحة؛ وإلا، فسيتم إرجاع -1 للإشارة إلى خطأ (ليس لديك إذن للوصول إلى example.txt). لاحظ أن الوظيفة المفتوحة موجودة في مكتبة unistd.h، وتم تعريف علامات الأذونات في fcntl.h.
'#include
'
'#include'
'#include'
'#define BUFFER_SIZE 4'int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
char buffer[BUFFER_SIZE];
read(fd, buffer, sizeof(buffer)-1);
printf("1st call : %s\n", buffer);
// prints the first 3 bytes
read(fd, buffer, sizeof(buffer)-1);
printf("2nd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("3rd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("4th call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("5th call : %s\n", buffer);
نتيجة الكود
المكالمة الأولى: HEL
المكالمة الثانية: LO
المكالمة الثالثة: WOR
المكالمة الرابعة: LD
المكالمة الخامسة: (فارغة)
يتم استخدام وظيفة القراءة، التي توفرها مكتبة unistd.h، لقراءة البيانات من واصف الملف. يستغرق الأمر ثلاث معلمات: واصف الملف، ومخزن مؤقت لتخزين بيانات القراءة، وعدد البايتات المراد قراءتها من الملف، وترجع وظيفة القراءة عدد البايتات المقروءة من الملف.
في جدول واصف الملف، هناك سمة تسمى الإزاحة. تقوم الإزاحة بتتبع الموضع الحالي داخل الملف. في كل مرة يتم استدعاء وظيفة القراءة، فإنها تقرأ البيانات بدءًا من الإزاحة الحالية ثم تقدم الإزاحة بعدد البايتات المقروءة. وهذا يضمن استمرار القراءات اللاحقة من حيث توقفت القراءة الأخيرة.
في مثالنا:
يقرأ الاستدعاء الثاني للقراءة البايتات الثلاثة التالية بدءًا من الإزاحة المحدثة (3)، ثم يقوم بتحديث الإزاحة إلى 6.
إلخ ...
الاستدعاء الخامس لقراءة المخزن المؤقت سيكون فارغًا وقراءة الإرجاعات 0 تشير إلى نهاية الملف.
تستمر هذه العملية حتى تتم قراءة كافة البيانات من الملف أو يحدث خطأ. يتم إنهاء المخزن المؤقت بقيمة خالية بعد كل قراءة لضمان إمكانية طباعته كسلسلة.
يأخذ char *get_next_line(int fd) واصف ملف للملف كمعلمة ويعيد سطرًا واحدًا لكل مكالمة. إذا وصل إلى نهاية الملف، فإنه يُرجع NULL.
https://github.com/Its-JoeTheKing/get_next_line
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3