برای نوشتن کاراکتر در فایلی که قبلاً باز شده است، از توابع putc و fputc استفاده میشود. طریقه استفاده از این دو تابع یکسان است. تابعputc در نسخههای جدید C و نیز fputc در نسخههای قدیمی C وجود داشته است. چون تابع putc به صورت ماکرو تعریف شده است، سرعت عمل آن بالاست. الگوی تابعputc به صورت زیر است.
int putc (int ch , FILE *fp)
در این الگو، ch کاراکتری است که باید در فایل نوشته شود و fp اشارهگری از نوع فایل است که مشخص میکند کاراکتر مورد نظر باید در چه فایلی نوشته شود.
برای خواندن کاراکترها از فایل میتوان از دو تابع getc و fgetc استفاده کرد. نحوه به کارگیری این دو تابع یکسان است. تابع fgetc در گونههای قدیمی C و نیز getc در گونههای جدید C وجود دارد. چون تابعgetc به صورت ماکرو پیادهسازی شده است، از سرعت بیشتری برخوردار است. الگوی این تابع به صورت زیر است.
int getc (FILE *fp)
در این الگو، fp اشارهگری است که مشخص میکند کاراکتر مورد نظر از کدام فایل باید خوانده شود. در مورد خواندن و نوشتن دادهها روی فایل باید به چند نکته توجه داشت.
اول اینکه، وقتی کاراکترهایی روی فایل نوشته میشوند باید مکان بعدیای که کاراکتر بعدی در آنجا قرار میگیرد مشخص باشد. همچنین وقتی که کاراکترهایی از فایل خوانده میشوند باید مشخص باشد که تاکنون تا کجای فایل خوانده شده است و کاراکتر بعدی از کجا باید خوانده شود. برای برآوردن این هدف، سیستم از متغیری به نام موقعیتسنج فایل استفاده میکند که با هر دستور خواندن یا نوشتن روی فایل مقدار این متغیر به طور خودکار تغییر میکند تا موقعیت فعلی فایل را مشخص نماید. لذا عمل نوشتن روی فایل و عمل خواندن از روی آن از جایی شروع میشود که این متغیر نشان میدهد.
در هنگام خواندن دادهها از فایل باید بتوان انتهای فایل را بررسی کرد؛ یعنی در برنامه باید بتوان این تست را انجام داد که اگر در حین خواندن دادهها از فایل موقعیتسنج فایل به انتهای فایل رسید دستور خواندن بعدی صادر نگردد، چرا که در غیر این صورت سیستم پیام خطایی را مبنی بر نبودن اطلاعات در فایل صادر میکند.
در حین خواندن دادهها از فایل متنی، پس از رسیدن به انتهای فایل، تابع getc یا fgetc علامت EOF را برمیگرداند. لذا در هنگام خواندن دادهها از فایل متنی میتوان به عمل خواندن ادامه داد تا اینکه کاراکتر خوانده شده برابر با EOF گردد. در فایل باینری برای تست کردن انتهای فایل از تابع feof استفاده میگردد. الگوی این تابع بهصورت زیر است.
int feof (FILE *fp)
در این الگو fp اشارهگری است که مشخص میکند این تابع باید روی چه فایلی عمل کند. تابع fopen علاوه بر تشخیص انتهای فایلهای باینری برای تشخیص انتهای فایلهای متنی نیز استفاده میشود.
مثال ۱۰ـ۲ برنامه زیر کاراکترهایی را از ورودی میخواند و در فایل متنی قرار میدهد. سپس دادههای موجود در این فایل را میخواند و به فایل دیگری منتقل میکند. آخرین کاراکتر ورودی نقطه در نظر گرفته شده است.
# include <stdio. h>
# include <stdlib. h>
void main (void)
{
FILE *in , *out ;
char ch ;
in = fopen (“F1.txt” , “w”) ;
if (in = = NULL)
{ printf (“cannot open F1.txt \n”) ;
exit(1) ;
}
do {
ch = getchar() ;
putc (ch , in) ;
}while (ch ! = ‘.’) ;
fclose(in) ;
out = fopen (“F2.txt” , “w”) ;
if (out = = NULL)
{ printf (“cannot open F2.txt “) ;
exit(1) ;
}
int = fopen (“F1.txt ” , “r”) ;
if (in = = NULL)
{ printf (“can not open F1.txt “) ;
exit(1) ;
}
ch = getc(in) ;
while (ch! = EOF)
{ putc(ch , out) ;
ch = getc (in) ;
}
fclose(in) ;
fclose(out) ;
}
مثال برنامهای بنویسید که کاراکترهایی را از صفحه کلید بگیرد و در فایل باینری قرار دهد. سپس کاراکترهای موجود در این فایل را بخواند و به فایل باینری دیگر منتقل کند. اسامی فایلهای ورودی و خروجی به عنوان آرگومان تابع اصلی به برنامه وارد میشوند.
# include <stdio. h>
# include <stdlib. h>
void main (int argc , char *argv[ ])
{
FILE *in , out ;
char ch ;
clrscr() ;
if (argc!=3)
{ printf (“you forget enter file name \n “) ;
exit(1) ;
}
in = fopen (argv[1] , “wb”) ;
if (in = = NULL)
{ printf (“cannot open (first) output file\n “);
exit (1) ;
}
do { ch = getchar() ;
putc(ch , in) ;
} while (ch ! = ‘.’) ;
fclose(in) ;
in = fopen (argv[1] , “rb”) ;
if (in = = NULL)
{ printf (“cannot open input file \n”) ;
exit(1) ;
}
out = fopen (argv[2] , “wb”) ;
if (out = = NULL)
{ printf (“cannot open output file \n “) ;
exit(1) ;
}
ch = getc(in) ;
while (!feof (in))
{
putc(ch , out) ;
ch = getc(in) ;
}
fclose(in) ;
fclose(out) ;
}