مدیریت فایل ها در زبان C، یک فایل برای ذخیره حجم بزرگی از داده های دائمی استفاده می شود. همانند دیگر زبان ها، زبان C توابع مدیریت فایل زیر را مهیا ساخته است:
- ایجاد یک فایل
- بازکردن یک فایل
- خواندن یک فایل
- نوشتن روی یک فایل
- بستن یک فایل
جدول زیر مهم ترین توابع مدیریت فایل در زبان C را آورده است:
تابع | هدف |
fopen () |
ایجاد یک فایل یا بازکردن یک فایل موجود |
fclose () |
بستن یک فایل |
fprintf () |
نوشتن یک بلوک داده در فایل |
fscanf () |
خواندن یک بلوک داده از یک فایل |
getc () |
خواندن یک کارکتر از یک فایل |
putc () |
نوشتن یک کارکتر در یک فایل |
getw () |
خواندن یک Integr از یک فایل |
putw () |
نوشتن یک integer در یک فایل |
fseek () |
تغییر مکان اشاره گر فایل به مکان مشخص |
ftell () |
مکان فعلی اشاره گر فایل را برمی گرداند |
rewind () |
اشاره گر فایل را در ابتدای فایل قرار می دهد. |
در این مبحث، خواهیم آموخت:
- نحوه ساخت یک فایل
- نحوه بستن یک فایل
- نحوه نوشتن در یک فایل
- تابع ()fputc
- تابع ()fputs
- تابع ()fprintf
- خواندن داده از یک فایل
- خواندن و نوشتن متقابل با getc و putc
نحوه ساخت یک فایل در زبان C
هرزمان که بخواهید با یک فایل کار کنید، قدم اول ایجاد فایل است. یک فایل چیزی جز فضایی در حافظه که داده در آن ذخیره می شود نیست.
برای ایجاد یک فایل در برنامه ‘C’ ساختار زیر استفاده می شود.
FILE *fp; fp = fopen ("file_name", "mode");
در ساختار بالا، فایل یک ساختار داده(data structure) است که در کتابخانه استاندارد تعریف شده است.
Fopen یک تابع استاندارد بوده که برای بازکردن یک فایل بکار می رود.
- اگر فایل در حال حاضر موجود نباشد، آنگاه فایل ابتدا ساخته شده و سپس باز می گردد.
- اگر فایل از قبل روی سیستم موجود باشد، آنگاه با استفاده از این تابع فایل مستقیماً باز می شود.
fp یک اشاره گر فایل بوده که به نوع فایل اشاره می کند.
هر زمان که یک فایل را ایجاد کرده و یا باز کنید، باید مشخص کنید که چه عملی می خواهید روی فایل انجام دهید. یک فایل در برنامه نویسی C را می توان برای اهداف نوشتن/خواندن ایجاد و یا باز کرد. برای مشخص کردن هرکدام از اهداف ذکر شده در زیر، از یک مد(mode) استفاده می شود. جدول زیر مدهای مختلفی که هنگام کارکردن با یک فایل در برنامه نویسی C قابل استفاده هستند را نشان می دهد.
مد فایل | توضیح |
r | باز کردن یک فایل برای خواندن. اگر فایل در مد خواندن باشد، آنگاه هیچ داده ای از فایل موجود در سیستم پاک نخواهد شد. |
w | باز کردن یک فایل برای نوشتن. اگر فایل در مد نوشتن باشد، آنگاه اگر فایلی وجود نداشته باشد، یک فایل جدید ساخته خواهد شد. اگر در حال حاضر فایل روی سیتم موجود باشد، آنگاه همه داده درون فایل بریده شده و فایل با هدف نوشتن باز می شود. |
a | فایل را در حالت افزودن(append) باز می کند. اگر فایل در مد افزودن باشد، آنگاه فایل باز می شود. محتوای درون فایل تغییری نمی کند. |
r+ | بازکردن فایل برای خواندن و نوشتن از ابتدا |
w+ | بازکردن فایل برای خواندن و نوشتن،جانویسی(overwriting) یک فایل |
a+ | بازکردن فایل برای نوشتن و خواندن، افزودن به یک فایل |
در دستور زبان داده شده، filename و mode به صورت رشته مشخص می شوند و بنابراین باید درون دابل کوتیشن قرار گیرند.
مثال:
#include <stdio.h> int main() { FILE *fp; fp = fopen ("data.txt", "w"); }
خروجی:
فایل در همان پوشه ای که کدتان را ذخیره کرده اید ایجاد می شود.
می توان هنگام ساخت فایل مسیر آن را نیز تعیین کرد:
#include <stdio.h> int main() { FILE *fp; fp = fopen ("D://data.txt", "w"); }
نحوه بستن فایل
زمانی که عملیات روی فایل به پایان می رسد باید حتما فایل را بست. این بدین معناست که محتوا و لینکها به فایل منقضی می شوند. اینکار از آسیب های تصادفی به فایل جلوگیری می کند.
زبان ‘C’ تابع fclose را برای انجام عملیات بستن فایل فراهم کرده است. دستور زبان fclose به صورت زیر است:
fclose (file_pointer);
مثال:
FILE *fp; fp = fopen ("data.txt", "r"); fclose (fp);
تابع fclose یک اشاره گر فایل را به عنوان ورودی می پذیرد. فایل مربوط به اشاره گر توسط تابع fclose بسته می شود. اگر عمل بستن موفق باشد مقدار 0 را برگردانده و اگر خطایی در بستن فایل پدید بیاید کارکتر (EOF(end of file را بر می گرداند.
پس از بستن فایل، اشاره گر آن را می توان برای دیگر فایل ها بکار برد.
در برنامه نویسی ‘C’، زمانی که برنامه پایان می پذیرد فایل ها به صورت خودکار بسته می شوند. بستن فایل ها با تابع fclose تمرین برنامه نویسی خوبی است.
نوشتن در یک فایل در زبان C
در C ، هنگام نوشتن درون یک فایل، کارکتر خط جدید ‘\n’ باید به صورت صریح اضافه شود.
کتابخانه stdio توابع ضروری برای نوشتن در یک فایل را فراهم می کند:
- (Fputc(char file, file_pointer : یک کارکتر در فایل مربوط به اشاره گر file_pointer می نویسد.
- (fputs(str, file_pointer: یک رشته درون فایل مربوط به اشاره گر file_pointer می نویسد.
- (fprintf(file_pointer, str, variable_lists : یک رشته را درون فایل مربوط به اشاره گر file_pointer چاپ می کند. رشته می تواند حاوی کارکترهای فرمت دهنده و لیستی از متغیرها variable_list باشد.
برنامه زیر نحوه نوشتن در یک فایل را نشان می دهد:
تابع ()fputc
#include <stdio.h> int main() { int i; FILE * fptr; char fn[50]; char str[] = "Guru99 Rocks\n"; fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode" for (i = 0; str[i] != '\n'; i++) { /* write to file using fputc() function */ fputc(str[i], fptr); } fclose(fptr); return 0; }
خروجی
برنامه بالا یک تک کارکتر را درون فایل fputc_test.txt می نویسد، تا زمانی که به کارکتر خط جدید “\n” برسد که این کارکتر نمایانگر این است که جمله با موفقیت نوشته شده است. فرآیند به صورت گرفتن هر کارکتر آرایه و نوشتن آن در فایل است.
- در برنامه فوق، یک فایل با نام txt در مد نوشتن ایجاد کرده و رشته ای که قرار است در فایل نوشته شود را نیز اعلان کرده ایم.
- عملیات نوشتن را با استفاده از یک حلقه for به صورت کارکتر به کارکتر و قرار دادن هر کارکتر درون فایل ادامه داده تا زمانی که به کارکتر “\n” برسیم و فایل را با تابع fclose ببندیم.
تابع ()fputs
#include <stdio.h> int main() { FILE * fp; fp = fopen("fputs_test.txt", "w+"); fputs("This is Guru99 Tutorial on fputs,", fp); fputs("We don't need to use for loop\n", fp); fputs("Easier than fputc function\n", fp); fclose(fp); return (0); }
خروجی:
- در برنامه فوق، یک فایل با نام txt را در مد نوشتن ایجاد و باز کرده ایم.
- بعد از آن عملیات نوشتن سه رشته مختلف با تابع fputs() را انجام می دهیم.
- فایل را با استفاده از تابع fclose می بندیم.
تابع ()fprintf
#include <stdio.h> int main() { FILE *fptr; fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode" /* write to file */ fprintf(fptr, "Learning C with Guru99\n"); fclose(fptr); return 0; }
خروجی:
- در برنامه بالا، فایلی با نام txt را در مد نوشتن ایجاد و باز کرده ایم.
- بپس از آن با استفاده از تابع ()fprint، یک رشته در فایل نوشته و سپس آن را با تابع fclose می بندیم.
خواندن داده از یک فایل
سه تابع مختلف برای خواندن داده از فایل اختصاص یافته است:
- (fgetc(file_pointer) : این تابع کارکتر بعدی از فایل مربوط به file pointer را برمی گرداند. وقتی به انتهای فایل رسید، کارکتر EOF برگردانده می شود.
- (fgets(buffer, n, file_pointer : این تابع n-1 کارکتر از فایل را برگردانده و رشته را درون buffer ذخیره کرده و کارکتر NULL یعنی ‘\0’ بعد از آخرین کارکتر افزوده می شود.
- (fscanf(file_pointer, conversion_specifiers, variable_adresses: این تابع برای تجزیه و تحلیل داده بکار می رود. کارکترها را از فایل خوانده و ورودی را به لیستی از متغیرهای اشاره گر variable_adresses با استفاده از فرمت دهنده ها ارجاع می دهد.توجه داشته باشید که scanf و fscanf هنگام رسیدن به فضای خالی و یا کارکتر خط جدید عمل خواندن را متوقف می کنند.
برنامه زیر عمل خواندن از فایل fputs_test.txt را به ترتیب با استفاده از توابع ()fgets()، fscanfو ()fgetc نشان می دهد:
#include <stdio.h> int main() { FILE * file_pointer; char buffer[30], c; file_pointer = fopen("fprintf_test.txt", "r"); printf("----read a line----\n"); fgets(buffer, 50, file_pointer); printf("%s\n", buffer); printf("----read and parse data----\n"); file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer char str1[10], str2[2], str3[20], str4[2]; fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4); printf("Read String1 |%s|\n", str1); printf("Read String2 |%s|\n", str2); printf("Read String3 |%s|\n", str3); printf("Read String4 |%s|\n", str4); printf("----read the entire file----\n"); file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer while ((c = getc(file_pointer)) != EOF) printf("%c", c); fclose(file_pointer); return 0; }
نتیجه:
----read a line---- Learning C with Guru99 ----read and parse data---- Read String1 |Learning| Read String2 |C| Read String3 |with| Read String4 |Guru99| ----read the entire file---- Learning C with Guru99
- در برنامه فوق، فایل “txt” را که قبلاً با استفاده از تابع ()fprintf نوشتیم و حاوی رشته “Learning C with Guru99” بود را باز می کنیم. با استفاده از تابع ()fgets عمل خواندن راانجام می دهیم. این تابع به صورت خط به خط خواندهشده و اندازه buffer باید برای نگه داشتن کل خط کافی باشد.
- برای بازنشانی اشاره گر فایل به ابتدای فایل، آن را دوباره باز می کنیم. به منظور نگه داشتن هر کلمه به صورت جداگانه چندین متغیر رشته ای ایجاد می کنیم. برای دیدن محتوای متغیرها آنها را چاپ می کنیم. تابع ()fscanf بیشتر برای استخراج و تجزیه داده ها از فایل بکار می روند.
- برای بازنشانی اشاره گر به ابتدای فایل آن را مجدداً باز کنید. داده را خوانده و با استفاده از تابع ()getc به صورت خط به خط چاپ کرده تا به دستور EOF برسیم.
- بعد از انجام عملیات مختلف خواندن ، فایل را با استفاده از تابع fclose می بندیم.
خواندن و نوشتن متقابل فایل با getc و putc
این دو آسان ترین عملیات روی فایل هستند. Getc مخفف get character بوده و putc مخفف put character است. این دو تابع برای دستکاری یک کارکتر در هر زمان استفاده می شوند.
برنامه زیر توابع مدیریت فایل در برنامه نویسی ‘C’ را نمایش می دهد.
#include <stdio.h> int main() { FILE * fp; char c; printf("File Handling\n"); //open a file fp = fopen("demo.txt", "w"); //writing operation while ((c = getchar()) != EOF) { putc(c, fp); } //close file fclose(fp); printf("Data Entered:\n"); //reading fp = fopen("demo.txt", "r"); while ((c = getc(fp)) != EOF) { printf("%c", c); } fclose(fp); return 0; }
خروجی:
- در برنامه فوق، یک فایل با نام demo را در مد نوشتن ایجاد و باز کرده ایم.
- بعد از نوشتن روی فایل، با دستور fclose فایل بسته می شود.
- مجدداً فایل را باز کرده اما این بار حاوی داده بوده و در مد خواند باز شده است. یک حلقه while تا زمان یافتن eof اجرا خواهد شد.زمانی که به انتهای فایل رسید عملیات تمام شده و داده با استفاده از تابع printf نمایش داده می شود.
- بعد از انجام عملیات خواندن، فایل با استفاده از تابع fclose مجدداً بسته می شود.
خلاصه مدیریت فایل ها در زبان C
- یک فایل فضایی در حافظه است که داده در آن ذخیره می شود.
- برنامه نویسی ‘C’ توابع مختلفی برای رسیدگی به فایل ها فراهم آورده است.
- سازوکار دستکاری فایل ها مدیریت فایل نامیده می شود.
- پیش از انجام هر عملیاتی فایل باید باز شود.
- یک فایل را می توان در مد خواندن، نوشتن و یا افزودن باز کرد.
- توابع getc و putc برای خواندن و نوشتن یک تک کارکتر بکار می روند.
- تابع ()fscanf خواندن و تجزیه داده از یک فایل را فراهم می کند.
- می توان عملیات خواندن کل یک فایل را(با استفاده از تابع getc) با اعمال حلقه روی سرتاسر آن و تا رسیدن به EOF انجام داد.
- با استفاده از تابع ()fprintf پس از ایجاد نام فایل، می توان روی آن رشته ای نوشت، اما باید کارکتر خط جدید در انتهای متن رشته قرار گیرد.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
سلام
بسیاااااار کامل
تشکر
دمتون گرم خدایی خیلی جامع و مفید بود.
بسیار خوب
خیلی کامل و عالی