میتوان فایل را هم به عنوان وسیله ورودی و هم به عنوان وسیله خروجی مورد استفاده قرار داد. برای این منظور کافی است در تابع fopen به جای mode از یکی از عباراتr+ یا r+t برای باز کردن فایل متنی موجود به عنوان ورودی و خروجی استفاده کرد. از یکی از عبارات w+ یا w + t برای ایجاد فایل متنی به عنوان ورودی و خروجی استفاده کرد. و نیز از یکی از عبارات a+ یا a + t برای ایجاد فایل متنی یا باز کردن فایل متنی موجود، به عنوان ورودی و خروجی استفاده کرد.
همچنین از عبارت r + b برای باز کردن فایل باینری موجود، به عنوان ورودی و خروجی استفاده کرد. از عبارت w + b برای ایجاد فایل باینری به عنوان ورودی و خروجی استفاده کرد. از عبارت a + b برای ایجاد یا بازکردن فایل موجود باینری به عنوان ورودی و خروجی استفاده کرد.
مثال دستورهای زیر را در نظر بگیرید.
fp1 = fopen (“test. dat” , “w+b”) ;
fp2 = fopen (“sample. dat” , “r+b”) ;
fp3 = fopen (“test2. dat” , “a+t”) ;
دستور اول، فایلی به نام test. dat را از نوع باینری و به صورت ورودی و خروجی باز میکند که اشارهگر fp1 به آن اشاره میکند. اگر این فایل قبلاً وجود داشته باشد، محتویات قبلی آن از بین خواهند رفت.
دستور دوم، فایلی به نام sample. dat را که اکنون در درایو جاری وجود دارد از نوع باینری و بهصورت ورودی و خروجی باز میکند. اگر این فایل بر روی درایو جاری وجود نداشته باشد، پیام خطایی صادر خواهد شد.
دستور سوم، فایلی به نام test 2. dat را از نوع متنی و به صورت ورودی و خروجی باز میکند. اگر فایل test2. dat قبلاً وجود نداشته باشد، ایجاد خواهد شد و اگر وجود داشته باشد اطلاعات قبلی آن محفوظ خواهد ماند و اطلاعات جدید به انتهای آن اضافه خواهد شد.
باتوجه به مطالبی که تاکنون در مورد فایلها گفتیم ، در حین کار با فایلها (نوشتن اطلاعات بر روی آنها و یا خواندن اطلاعات از آنها) برای برگشت به ابتدای فایل (تغییر موقعیتسنج فایل طوری که به ابتدای فایل اشاره کند) باید فایل را بست و مجدداً آن را باز کرد. اصولاً شاید در فایلهایی که فقط به عنوان خروجی یا فقط به عنوان ورودی باز میشوند، نیاز به برگشت به ابتدای فایل (بدون بستن و باز کردن مجدد آن) احساس نشود، ولی این امر در مورد فایلهای ورودی و خروجی ضروری است. برای این منظور از تابعی به نام rewind استفاده میگردد. الگوی این تابع در فایل stdio.h قرار دارد و به صورت زیر است.
void rewind (FILE *fp)
در این الگو fp به فایلی اشاره میکند که موقعیتسنج آن باید به ابتدای فایل اشاره کند.
مثال برنامه زیر رشتههایی را از ورودی میخواند و در فایل test قرار میدهد. سپس محتویات این فایل را میخواند و به صفحه نمایش منتقل میکند.
# include <stdio.h>
# include <stdlib.h>
void main (void)
{
FILE *fp ;
char str [80] ;
if ((fp=fopen (“test” , “w+”)) = NULL)
{
printf (“cannot open file\n”) ;
exit (1) ;
}
printf (“enter a string”) ;
printf (“Enter to quit \n”) ;
while (1)
{ gets (str) ;
if (!str [0]) break ;
strcat (str , “\n”) ;
fputs (str , fp) ;
}
printf (“\n the content of file is: \n “) ;
rewind (fp) ;
fgets (str , 79 , fp) ;
while (!feof (fp))
{ printf (“%s” , str) ;
fclose (str , 79 , fp) ;
}
fclose (fp) ;
}