کار با فایل ها در زبان C
در این فصل عملیات هایی (مانند ایجاد، نوشتن، خواندن و بستن) که با استفاده از زبان برنامه نویسی C می توان بر روی فایل های مختلف انجام داد را بررسی می کنیم. یک فایل دنباله ای از بایت ها می باشد و فرقی نمی کند که فایل باینری یا متنی باشد. زبان C توابع سطح بالا و همچنین سطح پایین (سطح سیستم عامل) را برای انجام عملیات های مختلف بر روی فایل ها در اختیار برنامه نویسان قرار می دهد. در این فصل شما یاد می گیرید که چگونه فایل ها را مدیریت کنید.
باز کردن فایل ها
شما می توانید برای ایجاد یک فایل و یا باز کردن فایلی که قبلا ایجاد شده است، از تابع fopen() استفاده کنید. زمانی که این تابع فراخوانی می شود، یک شیء از نوع FILE که شامل اطلاعات لازم برای مدیریت جریان (stream) فایل است، ایجاد می شود. الگوی این تابع را در زیر مشاهده می کنید:
FILE *fopen( const char * filename, const char * mode );
در الگوی بالا، filename نام فایلی است که می خواهید بر روی آن کار کنید و mode هم نحوه رفتار این تابع با آن فایل را مشخص می کند. پارامتر دوم یعنی mode می تواند یکی از مقادیر زیر باشد:
ردیف | توضیحات |
۱ | r
یک فایل متنی موجود را با هدف خواندن باز می کند. |
۲ | w
یک فایل متنی را با هدف نوشتن باز می کند. اگر فایل موجود نباشد آن را ایجاد می کند. این حالت همیشه از ابتدای فایل شروع به نوشتن می کند. |
۳ | a
یک فایل متنی را برای نوشتن و در حالت اضافه کردن (appending) باز می کند. در این حالت اگر محتوای در فایل وجود داشته باشد، برنامه از انتهاب آن محتوای کار نوشتن را انجام می دهد. اگر فایل موجود نباشد، آن را ایجاد می کند. |
۴ | r+
یک فایل متنی را هم برای خواندن و هم برای نوشتن باز می کند. |
۵ | w+
یک فایل را هم برای نوشتن و هم برای خواندن باز می کند. اگر فایل وجود داشته باشد، طول آن را به صفر می رساند و اگر وجود نداشته باشد، آن را ایجاد می کند. |
۶ | a+
یک فایل را هم برای نوشتن و هم برای خواندن باز می کند اگر فایل وجود نداشته باشد، آن را ایجاد می کند. در حالت، عملیات خواندن از ابتدای فایل شروع می شود ولی عملیات نوشتن از انتهای محتوای موجود شروع می شود. |
اگر می خواهید فایل ها را به صورت باینری پردازش کنید، می توانید از mode های زیر به جای mode های ذکر شده در جدول فوق استفاده کنید:
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
بستن یک فایل
به منظور بستن جریان یک فایل باز شده در زبان برنامه نویسی C می توانید از تابع fclose() استفاده کنید. الگوی این تابع را در زیر مشاهده می کنید:
int fclose( FILE *fp );
این تابع اگر موق شود فایل را ببندد، مقدار ۰ باز میگرداند و در صورت عدم موفقیت، مقدار EOF باز میگرداند. این تابع در حقیقت اطلاعات مربوط به فایل که در بافر است را از بین می برد و آن را از حافظه خارج می کند. EOF یک ثابت است که در فایل هدر stdio.h تعریف شده است.
نوشتن در فایل
در زیر ساده ترین راه برای نوشتن یک کاراکتر در یک فایل را مشاهده می کنید:
int fputc( int c, FILE *fp );
همان طور که در الگوی این تابع می بینید، این تابع یک کاراکتر می گیرد و آن را در فایل داده شده می نویسد. اگر عمل نوشتن موفقیت آمیز باشد مقدار صفر و در غیر این صورت EOF باز میگرداند.
به منظور نوشتن یک رشته خاتمه یافته با null می توانید از تابع fputs() استفاده کنید. در زیر الگوی این تابع را مشاهده می کنید:
int fputs( const char *s, FILE *fp );
پارامتر اول رشته ای مورد نظر و پارامتر دوم فایلی (یعنی اشاره گر فایلی) که می خواهید یان رشته در آن نوشته شود. اگر عمل نوشتن موفقیت آمیز باشد مقدار صفر و در غیر این صورت EOF باز میگرداند.
یکی از توابع دیگری که برای نوشتن استفاده می شود، تابع fprinf() می باشد. در زیر الگوی این تابع را مشاهده می کنید:
int fprintf(FILE *fp,const char *format, ...);
مثال زیر نحوه استفاده از این تابع را نشان می دهد:
#include <stdio.h> main() { FILE *fp; fp = fopen("/tmp/test.txt", "w+"); fprintf(fp, "This is testing for fprintf...\n"); fputs("This is testing for fputs...\n", fp); fclose(fp); }
قبل از اجرا مثال بالا مطمئن شوید که پوشه tmp وجو دارد. اگر وجود نداشت آن را ایجاد کنید.
زمانی که کد بالا کامپایل و اجرا شود، ابتدا فایل test.txt را در مسیر مشخص شده ایجاد می کند و سپس با استفاده از دو تابع مختلف دو خط را درون فایل موجود در پوشه tmp می نویسد.
خواندن از فایل
دستور ساده زیر، ساده ترین راه برای خواندن یک کاراکتر از یک فایل است:
int fgetc( FILE * fp );
تابع fgetc() یک کاراکتر را از فایلی که به آن داده می شود می خواند و به عنوان خروجی باز میگرداند. در صورتی که در خوان از فایل مشکلی بوجود آید مقدار EOF باز میگرداند.
تابع زیر امکان خواندن یک رشته از یک فایل را فراهم می کند:
char *fgets( char *buf, int n, FILE *fp );
تابع fgets() به تعداد n – ۱ کاراکتر از فایلی که به آن داده می شود، می خواند و در بافر buf قرار می دهد، سپس مقدار null را به منظور خاتمه دادن به رشته، به انتهای بافر buf اضافه می کند.
اگر تابع fgets() با یک کاراکتر خط جدید یا EOF رو به رو شود، عملیات خواندن را متوقف می کند و فقط کاراکتر خوانده شده تا قبل از خط جدید یا EOF باز گردانده می شوند.
همچنین می توانید از تابع fscanf() نیز به منظور خواندن یک رشته از فایل استفاده کنید. الگوی این تابع را در زیر مشاهده می کنید:
int fscanf(FILE *fp, const char *format, ...);
تابع fscanf() هنگامی که با اولین کاراکتر فضای خالی (space) مواجه شود، عمل خواندن را متوقف می کند. مثال زیر نحوه استفاده از توابع فوق را نشان می دهد:
#include <stdio.h> main() { FILE *fp; char buff[255]; fp = fopen("/tmp/test.txt", "r"); fscanf(fp, "%s", buff); printf("1 : %s\n", buff ); fgets(buff, 255, (FILE*)fp); printf("2: %s\n", buff ); fgets(buff, 255, (FILE*)fp); printf("3: %s\n", buff ); fclose(fp); }
زمانی که کد بالا توسط کامپایلر زبان C و اجرا شود، فایلی که در بخش نوشتن در فایل ایجاد شد را می خواند و محتوای زیر را تولید می کند:
1 : This 2: is testing for fprintf... 3: This is testing for fputs...
توابع ورودی / خروجی باینری
در زبان C دو تابع وجود دارد که می توان از آن ها برای ورودی / خروجی های باینری استفاده کرد:
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
هر دو از این توابع باید برای خواندن یا نوشتن بلوک های خاطره استفاده شوند (معمولا آرایه ها یا ساختارها).
هر دو این توابع باید برای خواندن و یا نوشتن بلوک های از حافظه (معمولا آرایه ها و ساختارها) استفاده شوند. به عبارت دیگر برای نوشتن محتویات یک آرایه یا ساختار درون یک فایل و همچنین برای خوان این محتویات از فایل توابع فوق استفاده می شوند.
نوشته کار با فایل ها در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.