توابعی برای کار با فایل ها وجود دارد که می توان فایل های متنی (نه تنها فایل هایی با فرمت .txt بلکه حتی فایل های صفحات وب مانند .html یا .php و…) ویرایش کرد. منظور از ویرایش خواندن فایل، افزودن مقادیری به فایل و یا اعمالی مانند حذف یا تغییر نام فایل را انجام داد. در ادامه به توضیح این توابع می پردازیم.

باز کردن فایل با fopen()

برای انجام هرگونه تغییرات یا خواندن اطلاعات و یا هرکار دیگر بر روی فایل ها نیاز است تا ابتدا فایل مورد نظر را باز کنیم. برای بازکردن فایل از تابع fopen() استفاده می کنیم. این تابع شامل دو پارامتر می باشد. پارامتر ابتدایی filename می باشد که نام یا مسیر فایل موردنظر را مشخص می کند و پارامتر دوم mode می باشد که حالت بازکردن فایل را مشخص می کند. شکل کلی آن به شکل زیر است:

fopen(filename, mode);

منظور از حالت بازکردن فایل یعنی شما قصد انجام چه اعمالی را با فایل موردنظر دارید. مقادیر قابل دریافت برای این پارامتر به همراه توضیح آنها در جدول زیر آمده است:

حالت توضیحات
r تنها قابل خواندن است. اشاره گر در ابتدای فایل قرار می گیرد.
r+ قابل خواندن و نوشتن اطلاعات وجود دارد. اشاره گر در ابتدای فایل قرار می گیرد.
w تنها قابل نوشتن می باشد. اگر فایل وجود نداشته باشد یک فایل می سازد و اگر وجود داشته باشد مقادیر موجود در آن را پاک می کند.
w+ قابل خواندن و نوشتن اطلاعات وجود دارد. اگر فایل وجود نداشته باشد یک فایل می سازد و اگر وجود داشته باشد مقادیر موجود در آن را پاک می کند.
a فایل را بازکرده و در انتهای آن شروع به نوشتن می کند. اگر فایل وجود نداشته باشد یک فایل جدید ساخته می شود (Append).
a+ علاوه بر نوشتن در انتهای فایل قابل خواندن نیز می باشد.
x تنها قابل نوشتن می باشد. اگر فایل مورد نظر از پیش وجود داشته باشد خطایی ایجاد می شود و مقدار false برگردانده می شود.
x+ علاوه بر نوشتن قابل خواندن نیز می باشد. اگر فایل از پیش وجود داشته باشد خطایی ایجاد شده و مقدار false برگردانده می شود.

 

در مثال زیر فایلی با نام data.txt را به شکل فقط خواندنی یا Readonly(r) باز می کنیم:

fopen(“data.txt”, “r”);

بستن فایل با fclose()

هرفایلی که باز می شود لازم است تا بسته شود. تابع fclose() کار بستن یک فایل را انجام می دهد. این تابع تنها یک پارامتر به نام handle دارد که فایلی که پیش از این باز شده را مشخص می کند. هر فایلی که باز می شود باید درون متغیری قرار گیرد تا پس از آن با استفاده از آن شناخته شود. شکل کلی این تابع به شکل زیر است:

fclose(handle);

فایلی که در مثال پیش باز کردیم را به شکل زیر می بندیم:

 

 

خواندن مقادیری از فایل با fread()

پس از بازکردن فایل نوبت به خواندن اطلاعات می باشد. اولین تابع برای خواندن اطلاعات تابع fread() می باشد اما زیاد مورد استفاده قرار نمی گیرد و از توابع بعدی بیشتر استفاده می شود اما مختصرا به توضیح این تابع می پردازیم.

فایل data.txt شامل متن زیر می باشد:

Hello World!!!

Welcome to PHP learning totourial…

It’s last line of test text.

این تابع شامل دو پارامتر می باشد که پارامتر اول handle می باشد که فایل از پیش باز شده را مشخص و پارامتر دوم length می باشد که تعداد حروف موردنظر برای خواندن را مشخص می کند. شکل کلی آن به شکل زیر است:

fread(handle, length);

در این مثال می خواهیم تعداد 15 کاراکتر از فایل data.txt را خوانده و چاپ کنیم. کد حاصل به شکل زیر خواهد بود:

 

 

خروجی:

مثالی از استفاده از تابع fread برای خواندن فایل ها در PHP

خروجی

 

همانطور که می بینید 15 کاراکتر ابتدایی فایل data.txt که به صورت فقط خواندنی (با کاراکتر “r”) باز شده بود چاپ شد که برابر با عبارت Hello World!!! می باشد.

خواندن یک فایل به صورت خط به خط با fgets()

با استفاده از تابع fgets() می توان محتویات یک فایل را به صورت خط به خط دریافت کرد. این تابع تنها دارای یک پارامتر اجباری است به نام handle که فایل باز شده را مشخص می کند. شکل کلی آن به شکل زیر است:

fgets(handle);

می خواهیم تمام محتویات فایل data.txt را به صورت خط به خط و با استفاده از تابع fgets() چاپ کنیم. کد این برنامه به شکل زیر خواهد بود:

خروجی:

مثالی از استفاده از تابع fgets در PHP برای خواندن فایل ها

خروجی

در این مثال ابتدا فایل را به صورت فقطخواندنی بازکرده ایم. در هربار اجرای تابع fgets() اشاره گر به خط بعد می رود و با اجرای دوباره این تابع خط بعد و … . و در آخر نیز فایل باز شده را می بندیم. در این مثال ما تعداد خطوط فایل data.txt را می دانستیم پس، از حلقه for استفاده کردیم اما ممکن است همیشه تعداد خطوط برای ما معلوم نباشد.

بررسی انتهای فایل با feof()

می توان با استفاده از این تابع به انتها رسیدن اشاره گر را بررسی کرد. پس می توانیم به جای استفاده از حلقه for برای مثال قبل از حلقه while استفاده کرد. این تابع تنها شامل یک پارامتر معروف handle می باشد که پیش از این توضیح داده شد. مقدار بازگشتی این تابع در صورت رسیدن اشاره گر به پایان فایل مقدار TRUE و درغیر این صورت مقدار FALSE برگردانده می شود. شکل کلی استفاده از این تابع به شکل زیر می باشد:

feof(handle);

پس می توان مثال قبل را به صورت زیر نیز نوشت اما خروجی آن یکسان می باشد:

 

خواندن یک فایل به صورت کاراکتر به کاراکتر با fgetc()

علاوه بر خواندن فایل به صورت خط به خط (Line by line) می توان محتویات یک فایل را به صورت کاراکتر به کاراکتر (Character by character) نیز خواند. تابع fgetc() پس از خواندن هر کاراکتر اشاره گر را یکی به جلوتر می برد. این تابع همچون تابع fgets() می باشد و تنها شامل یک پارامتر handle می باشد. شکل کلی استفاده از این تابع به شکل زیر می باشد:

fgetc(handle);

در این مثال نیز می خواهیم تمام محتویات فایل data.txt را چاپ کنیم. کد برنامه ی ما به شکل زیر است:

 

خروجی:

مثالی از استفاده تابع fgetc در PHP برای خواندن فایل ها

خروجی

این برنامه هر حرف (کاراکتر) از فایل متنی موردنظر را به همراه یک فاصله (با استفاده از “\t” ) چاپ می کند.

نوشتن در فایل با fwrite()

نوبت به نوشتن در فایل های باز شده رسید. تابع fwrite() به همین جهت استفاده می شود. این تابع شامل دو پارامتر می باشد پارامتر ابتدایی handle می باشد که پیشتر با آن آشنا شدید و پارامتر دوم string می باشد که متنی که قرار است در فایل نوشته شود را مشخص می کند. شکل کلی این تابع به شکل زیر است:

fwrite(handle, string);

می خواهیم با استفاده از این تابع مقداری را در فایل data.txt نوشته و سپس مقادیر آن را چاپ کنیم. کد این برنامه به شکل زیر است:

خروجی:

مثالی از استفاده تابع fwrite در PHP برای نوشتن در فایل ها

خروجی

پس از چند بار اجرا کردن این قطعه کد خروجی به این شکل خواهد بود.

دقت کنید چون در این مثال می خواستیم مقادیری را در فایل متنی بنویسیم از مقدار a+ برای حالت بازکردن فایل استفاده کردیم تا بتوانیم علاوه بر خواندن محتویات، مقادیری را نیز بیفزاییم.

اگر دقت کنید فایل موردنظر ما در این کد پس از نوشتن مقادیری بسته شده و برای خواندن محتویات دوباره باز شده است. اگر این کار را نکنیم و تنها با یک بار باز کردن فایل بخواهیم هر دو عمل نوشتن و خواندن اطلاعات را انجام دهیم هیچ چیز در خروجی نخواهیم داشت.