معالجة الملفات في C - كيفية فتح الملفات وإغلاقها والكتابة إليها

إذا كنت قد كتبت helloworldبرنامج C من قبل ، فأنت تعرف بالفعل ملف I / O الأساسي في C:

/* A simple hello world in C. */ #include  // Import IO functions. #include  int main() { // This printf is where all the file IO magic happens! // How exciting! printf("Hello, world!\n"); return EXIT_SUCCESS; }

تعتبر معالجة الملفات من أهم أجزاء البرمجة. في لغة C ، نستخدم مؤشر بنية لنوع ملف للإعلان عن ملف:

FILE *fp;

يوفر C عددًا من الوظائف المضمنة لإجراء عمليات الملفات الأساسية:

  • fopen() - إنشاء ملف جديد أو فتح ملف موجود
  • fclose() - أغلق ملف
  • getc() - يقرأ حرف من ملف
  • putc() - يكتب حرفًا إلى ملف
  • fscanf() - يقرأ مجموعة بيانات من ملف
  • fprintf() - يكتب مجموعة من البيانات إلى ملف
  • getw() - يقرأ عددًا صحيحًا من ملف
  • putw() - يكتب عددًا صحيحًا إلى ملف
  • fseek() - اضبط الموضع على نقطة الرغبة
  • ftell() - يعطي الموقع الحالي في الملف
  • rewind() - اضبط الموضع على نقطة البداية

فتح ملف

تُستخدم fopen()الوظيفة لإنشاء ملف أو فتح ملف موجود:

fp = fopen(const char filename,const char mode);

هناك عدة أوضاع لفتح ملف:

  • r - افتح ملفًا في وضع القراءة
  • w - فتح أو إنشاء ملف نصي في وضع الكتابة
  • a - يفتح ملف في وضع الإلحاق
  • r+ - يفتح ملفًا في وضع القراءة والكتابة
  • a+ - يفتح ملفًا في وضع القراءة والكتابة
  • w+ - يفتح ملفًا في وضع القراءة والكتابة

فيما يلي مثال على قراءة البيانات من ملف والكتابة إليها:

#include #include main() { FILE *fp; char ch; fp = fopen("hello.txt", "w"); printf("Enter data"); while( (ch = getchar()) != EOF) { putc(ch,fp); } fclose(fp); fp = fopen("hello.txt", "r"); while( (ch = getc(fp)! = EOF) printf("%c",ch); fclose(fp); }

الآن قد تفكر ، "هذا فقط يطبع النص على الشاشة. كيف يتم هذا الملف IO؟"

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

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

فكيف يرتبط ذلك بـ helloworldIO وتقديمه؟

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

هناك نوعان من التدفقات الأخرى (أي الملفات) المتاحة لك بجهد ، stdinو stderr. stdinيمثل الإدخال القياسي ، والذي عادةً ما يربطه الغلاف الخاص بك بلوحة المفاتيح. stderrيمثل ناتج الخطأ القياسي ، والذي عادةً ما تعلقه الصدفة على الجهاز.

ملف أولي IO ، أو كيف تعلمت وضع الأنابيب

كفى نظرية ، دعنا نبدأ العمل بكتابة بعض الأكواد! أسهل طريقة للكتابة إلى ملف هي إعادة توجيه دفق الإخراج باستخدام أداة إعادة توجيه الإخراج ، >.

إذا كنت تريد الإلحاق ، يمكنك استخدام >>:

# This will output to the screen... ./helloworld # ...but this will write to a file! ./helloworld > hello.txt

محتويات hello.txtالإرادة ، ليس من المستغرب أن تكون

Hello, world!

لنفترض أن لدينا برنامجًا آخر يسمى greet، مشابهًا helloworld، يستقبلك بمعرّف معين name:

#include  #include  int main() { // Initialize an array to hold the name. char name[20]; // Read a string and save it to name. scanf("%s", name); // Print the greeting. printf("Hello, %s!", name); return EXIT_SUCCESS; }

بدلاً من القراءة من لوحة المفاتيح ، يمكننا إعادة التوجيه stdinللقراءة من ملف باستخدام <الأداة:

# Write a file containing a name. echo Kamala > name.txt # This will read the name from the file and print out the greeting to the screen. ./greet  Hello, Kamala! # If you wanted to also write the greeting to a file, you could do so using ">".

ملاحظة: عوامل إعادة التوجيه هذه موجودة في bashوأصداف مماثلة.

الصفقة الحقيقية

الأساليب المذكورة أعلاه تعمل فقط مع الحالات الأساسية. إذا كنت ترغب في القيام بأشياء أكبر وأفضل ، فربما تريد العمل مع الملفات من داخل C بدلاً من خلال shell.

لتحقيق ذلك ، سوف تستخدم وظيفة تسمى fopen. تأخذ هذه الوظيفة معلمتين من معلمات السلسلة ، الأولى هي اسم الملف والثانية هي الوضع.

الوضع هو أذونات في الأساس ، لذلك rللقراءة wوالكتابة aوالإلحاق. يمكنك أيضًا دمجها ، rwمما يعني أنه يمكنك القراءة والكتابة في الملف. هناك المزيد من الأوضاع ، لكنها الأكثر استخدامًا.

بعد أن يكون لديك FILEمؤشر ، يمكنك استخدام نفس أوامر الإدخال والإخراج التي كنت ستستخدمها بشكل أساسي ، باستثناء أنه يجب عليك إضافة بادئة إليها fوستكون الوسيطة الأولى هي مؤشر الملف. على سبيل المثال ، printfإصدار الملف هو fprintf.

إليك برنامج يسمى greetingsيقرأ من ملف يحتوي على قائمة بالأسماء ويكتب التحيات إلى ملف آخر:

#include  #include  int main() { // Create file pointers. FILE *names = fopen("names.txt", "r"); FILE *greet = fopen("greet.txt", "w"); // Check that everything is OK. if (!names || !greet) { fprintf(stderr, "File opening failed!\n"); return EXIT_FAILURE; } // Greetings time! char name[20]; // Basically keep on reading untill there's nothing left. while (fscanf(names, "%s\n", name) > 0) { fprintf(greet, "Hello, %s!\n", name); } // When reached the end, print a message to the terminal to inform the user. if (feof(names)) { printf("Greetings are done!\n"); } return EXIT_SUCCESS; }

افترض أنه names.txtيحتوي على ما يلي:

Kamala Logan Carol

ثم بعد تشغيل greetingsالملف greet.txtسوف يحتوي على:

Hello, Kamala! Hello, Logan! Hello, Carol!