Programming Freaks  | دورات ومقالات برمجيه

Please login or register.

Login with username, password and session length
Advanced search  

News:

Please Read our FAQ

Author Topic: التعامل مع الملفات في ال c  (Read 1172 times)

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
التعامل مع الملفات في ال c
« on: August 24, 2009, 05:27:17 PM »
C standard files manipulating functions


دوال التعامل مع الملفات في ال C
ملاحظة مهمه جدا : لغة ال c نفسها لا تقوم بتعريف اي نوع من انواع ال input/output ولكن يتم الحصول علي ذلك وتطبيقه من خلال الدوال التي تم كتابتها بلغة السي وتم التوافق عليها في ال standard c library
اي انه عن فتح ملف او قرائة ملف لا يجب عليك انك تقوم بكتابة functions بنفسك لكي تتعامل مع ذلك , هناك دوال تم تصميمها خصيصا لك ومضمنه في مكتبة ال c القياسيه
تختلف تلك المكتبه من نظام الي اخر ولكن كلها تتفق علي في انها تجعل ال code الخاص بك portable اي انه سوف يعمل علي جميع الانظمه التي تستخدم ال standard c library الاختلاف يكون اختلاف داخلي في وظائف الداله , اذا لم تفهم اي شيئ من ماسبق فلا تقلق لانه لن يقوم بعمل فرق في استخدامك او فهمك لتلك الدوال , فقط احببت ان اقوم بوضع تلك الملاحظه.


تحتوي ال c standard علي data structure او ماتسمي بمنشئة بيانات خاصه بالتعامل مع الملفت
تدعي ب FILE  تحتوي تلك المنشاه علي عدة عناصر للتعامل مع الملف
من ضمنها اين نوجد حاليا في الملف , تصريح الملف , ...;

كيف نتعامل مع تلك العناصر؟
عن طريق بعض الدوال تتعرف عليها الان ;

كيف نقوم بفتح ملف عن طريق تلك الدوال ؟
اول شيئ يجب عليك فعله هو تحضير تلك المنشئه
لنبدا بكتابة اول سطر في الكود

Code: [Select]

#include<stdio.h>

int main(void)
{
    FILE* file_to_open;


قمنا بتعريف مؤشر الي structure من النوع file (لا تستغرب معرفه في ال stdio ومحوله بواسطة typedef )
اصبح لدينا الان data structure لنتعامل مع الملف عن طريقها

كيف اذن نقوم بفتح الملف ؟


Code: [Select]
#include <stdio.h>

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


داله ترجع مؤشر الي ال FILE structure المرد التطبيق عليها
اول شيئ يمرر الي الداله مكان وجود الملف
ثاني شيئ طريقة فتح الملف وكيفية التعامل معه
عن طريق mode تستطيع فتح ملف اما للقرائه او للكتابه او للدمج
r , w , a
لاحظ انه في حالة فتح ملف لللقرائه فقط يجب ان يكون الملف موجود مسبقا او تفشل الداله في فتحه
واذا كان الملف موجود مسبقا وتم فتحه للكتابه يتم تدمير محتوياته واذا لم يكن موجود اصلا يتم انشائه
واذا فتح للدمج ولم يكن موجود مسبقا يتم انشائه اما اذا كان موجود يتم ارجاع اخر مكان كتب فيه الي ال FILE structure (راجع تعريفها )
اما اذا استخدمت
r+ , w+  , a+
الاولي تعني للقرائه و الكتابه بدون تدمير محتويات
الثانيه تعني فتح الملف للقرائه والكتابه واذا لم يكن موجود انشئه اما اذا كان موجود دمر محتوايته ثم افتحه للتعامل معه .
الثالثه تعني افتح الملف للدمج والقرائه اذا كان موجود اشر الي نهاية الملف للقرائه او الكتابه اذا لم يكن موجود قم بانشائه واشر الي البدايه .
لاحظ انه في حالة الفشل الداله ترجع NULL ويمكنك استخدام perror
يجب عليك اغلاق الملف بعد الانتهاء منه , سوف يغلق باي حال من الاحوال عند انتهاء البرنامج من العمل ولكن اغلاقه يعد good programming practice  .
ولكي تتعرف الي المزيد من تلك الخصائص قم بكتابة man fopen


Code: [Select]
Int fclose(FILE *file);

مثال علي ذلك :

Code: [Select]
#include<stdio.h>
#include<unistd.h>
#include<errno.h>

int main(void)
{
    FILE* file_to_open;
   
    file_to_open = fopen("textfile" , "r+");
   
    if(file_to_open == NULL)
    {
                    perror("fopen()");
                    _exit(1);
    }
          fclose(file_to_open);
    return 0;
}                     


مفهوم وواضح جدا  :)


كيف اذن ننفذ عمليات علي ذلك الملف , كيف نكتب بداخله او نقرا منه ؟
عدة دوال مستخدمه في ذلك مثال

fgets , fputs , fprintf , fscanf , fputc , fgetc ;


اولا

Code: [Select]
   char *
     fgets(char * restrict str, int size, FILE * restrict stream);

تقوم بالكتابه داخل السلسله str بالحجم المطلوب size من ال stream 
ال stream هو الملف المطلوب
تقرا سطر واحد فقط لاغير لانه عندما تجد ان السطر الحالي انتهي (ضغط enter ) تقوم بانهاء القرائه وتخزين ماتم قرائته في str والانتهاء .

لاحظ انه stdin هو احدي ال streams المفتوحه دائما معك .

مثال لقرائة اول سطر  من الملف

/etc/services
 

Code: [Select]

#include<stdio.h>
#include<unistd.h>
#include<errno.h>

int main(void)
{
    FILE* file_to_open;
    char buffer[81]; /*enough to hold one line*/
   
    file_to_open = fopen("/etc/services" , "r"); /*open for read*/
   
    if(file_to_open == NULL)
    {
                    perror("fopen()");
                    _exit(1);
    }
   
    fgets(buffer , 250 , file_to_open);
    printf("File /etc/services first line is\n"
                 "%s",buffer);
    fclose(file_to_open);
   
    return 0;
}                   




ماذا اذا اردنا الكتابه داخل ملف ؟


Code: [Select]

 #include <stdio.h>

     int
     fputs(const char *str, FILE *stream);

قم بكتابة السلسله str بداخل ال stream .

Code: [Select]
#include<stdio.h>
#include<unistd.h>
#include<errno.h>

int main(void)
{
    FILE* file_to_open;
    char buffer[81]; /*enough to hold one line*/
    file_to_open = fopen("test" , "w"); /*open for  write if exist*/
    strcpy(buffer , "Hello Files\n"); /*copy our string */
    if(file_to_open == NULL)
    {
                    perror("fopen()");
                    _exit(1);
    }
    fputs(buffer , file_to_open); /*write it */
    printf("File test file has line \n"
                 "%s",buffer);
    fclose(file_to_open);
   
    return 0;



استكشف الباقي بنفسك . لاحظ انه بعد كتابتك النص اصبح file_to_read يؤشر الي نهاية الملف اذا كنت تحتاج ان تقوم بالكتابه مره اخري استخدم rewind();
Code: [Select]
 
  void
     rewind(FILE *stream);

اذا اردت معرفة  موقعك في الملف بالتحديد استخدم
Code: [Select]
 
     long
     ftell(FILE *stream);

اذا اردت تغير موقع في الملف استخدم

Code: [Select]
int
     fseek(FILE *stream, long offset, int whence);

كود كامل يشرح ذلك يكتب سلسله داخل ملف ويقوم بعمل rewind للملف ثم يقرئها ثم يقوم بعمل rewind مره اخري ويحرك المؤشر بواسطة fseek الي نهاية الملف ويخربك مكانك في الملف باتحديد (عدد ال bytes السابقه )

Code: [Select]
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
int main(void)
{
    FILE* file_to_open;
    char buffer[81]; /*enough to hold one line*/
    char buf[81]; /*enough to read one line*/
    unsigned long int pos;
    file_to_open = fopen("test.txt" , "w+"); /*open for read and write if exist*/
    strcpy(buffer , "Hello Files\n"); /*copy our string */
    if(file_to_open == NULL)
    {
                    perror("fopen()");
                    _exit(1);
    }
    fputs(buffer , file_to_open); /*write it */
    rewind(file_to_open);
    pos = ftell(file_to_open);
    printf("Current position %lu\n",pos);
    fgets(buf , 81 , file_to_open);
    printf("File test has %s\n",buf);
    rewind(file_to_open);
    fseek(file_to_open , SEEK_END , 0 ); /* reacg end of file */
    pos = ftell(file_to_open);
    printf("File test size %lu\n",pos);
    fclose(file_to_open);
   
    return 0;
}                   


ملاحظة : لم اقم بالتحقق من اي نوع من انواع الاخطائ في هذه الاكواد ولكن يجب عليك انت ان تفعل ذلك اذا كنت سوف تستخدمه في برنامج حقيقي
لتتحقق من فشل او نجاح عملية فتح الملف مثلا
قم بعمل

Code: [Select]

if(!file_to_open)
     /*error*/

 في هذه الخطوه قمنا بالتحقق من اذا تم فتح الملف ام لا , راجع ال man pages لكل دالة وتحقق من القسم RETURN VALUE لكي تعرف كيف تتحقق من الاخطاء

وبكده نكون انتهينا من مبادئ التعامل مع الملفات في السي
« Last Edit: August 24, 2009, 05:33:18 PM by St0rM »
Logged