اگر لازم باشد که داده‌ها با فرمت خاصی در فایل نوشته یا از آن خوانده شوند می‌توان از دو تابع fprintf و fscanf استفاده کرد. این دو تابع دقیقاً کار توابع printf و scanf را در ورودی – خروجی معمولی (غیر از فایل) انجام می‌دهند. الگوی این توابع در فایل stdio. h قرار دارد و به صورت زیر است.
int fprintf (FILE *fp , “*control_string , …” , char arg , …)
int fscanf (FILE *fp , “*control_string , …” , char arg , …)
در این الگو fp اشاره‌گری است که مشخص می‌کند اعمال این توابع باید روی چه فایلی انجام شود. control_string مشخص می‌کند که داده‌ها یا args باید با چه فرمتی نوشته یا خوانده شوند.
مثال  برنامه زیر یک رشته و یک عدد صحیح را از ورودی می‌خواند و آن را در فایل می‌نویسد. سپس از این فایل می‌خواند و در صفحه نمایش چاپ می‌کند.
# include <stdio. h>
# include <stdlib. h>
# include <io. h>
void main (void)
{
FILE *fp ;
char str[80] , number [10] ;
int t ;
if ((fp = fopen (“test” , “w”)) = = NULL)
{
printf (“cannot open file\n”) ;
exit (1) ;
}
printf (“\n enter string:  “) ;
gets (str) ;
strcat (str , “\n”) ;
printf (“\n enter a number:  “) ;
gets (number) ;
t = atoi (number) ;
fprintf (fp , “%s%d , str , t) ;
fclose (fp) ;
if ((fp = fopen (“test” , “r”)) = = NULL)
{
printf (“cannot open file \n”) ;
exit (1) ;
}
fscanf (fp , “%s%d” , &str , &t) ;
printf (“\nstring = %s , digit = %d” , str , t) ;
}

در مورد توابع fprintf و fscanf باید توجه داشت که علی‌رغم اینکه ورودی ـ خروجی با این دو تابع آسان است، اطلاعات به همان صورتی که در صفحه نمایش ظاهر می‌شوند در فایل ذخیره می‌گردند. برای مثال، عدد ۲۶۷ که در صفحه نمایش ۳ بایت را اشغال می‌کند، اگر با تابع fprintf روی فایل نوشته شود نیز ۳ بایت را اشغال خواهد کرد (توجه داریم که عدد ۲۶۷ عدد صحیح است و در دو بایت ذخیره می‌شود). این بدین معنی است که هر رقم به ‌صورت کاراکتر تلقی می‌گردد. اگر این عدد با تابع fscanf از روی فایل خوانده شود، باید عمل تبدیل کاراکتر به عدد صورت گیرد که مستلزم صرف وقت است. برای جلوگیری از بروز این مشکل از دو تابع fread و fwrite که در ادامه بررسی خواهند شد استفاده می‌شود.