در حین انجام کار با فایلها ممکن است خطایی رخ دهد. برای مثال، عدم وجود فضای کافی برای ایجاد فایل، آماده نبودن دستگاهی که فایل باید در آنجا تشکیل گردد یا مواردی از این قبیل منجر به بروز خطا میشوند. با استفاده از تابع ferror میتوان از بروز چنین خطایی مطلع شد. الگوی تابع ferror در فایل stdio.h قرار دارد و به صورت زیر است.
int ferror (FILE *fp)
در الگوی فوق fp اشارهگری است که مشخص میکند این تابع باید روی چه فایلی عمل کند. این تابع تابعی منطقی است؛ بدین معنی که اگر خطایی در رابطه با فایلها رخ داده باشد این تابع ارزش درست و در غیر این صورت ارزش نادرست را برمیگرداند. برای تشخیص خطا در کار با فایلها، بلافاصله پس از هر عملی که روی فایل انجام میشود باید از این تابع استفاده کرد.
مثال برنامه زیر کاراکترهای tab را از فایل حذف میکند و به جای آن به تعداد کافی فضای خالی یا blank قرار میهد. اسامی فایلهای ورودی و خروجی از طریق آرگومان به برنامه وارد میشود.
# include “stdio. h”
# include “stdlib. h”
# define TAB_SIZE 8
# define OUT 1
# define IN 1
void err (int) ;
void main (int argc , char *argv[ ])
{
FILE *in , *out ;
int tab , i ;
char ch ;
if (argc! = 3)
{
printf (“\n incorrect number of parameters “) ;
printf (“\n\t press any key …”) ;
getch () ;
exit (1) ;
}
in = fopen (argv[2] , “wb”) ;
if (in = = NULL)
{
printf (“\n cannot open output file “) ;
printf (“\n\t press a key …”) ;
exit (1) ;
}
tab = 0 ;
do {
ch = getc(in) ;
if (ferror (in))
err (IN) ;
if (ch = = ’\t’)
{ for (i = tab ; i<8 ; i + +)
{ putc (‘ ‘ , out) ;
if (ferror (out))
err (OUT) ;
}
tab = 0 ;
}
else
{ putc(ch , out) ;
if (ferror (out))
err (OUT) ;
tab + + ;
if (tab = = TAB_SIAE || ch = = ’\n’ || ch = = ’\r’)
tab = 0 ;
}
}while (!feof (in)) ;
fclose (in) ;
fclose (out) ;
}
void err (int error)
{
if (erro = = IN)
printf (“\n error on input file. “)
else
printf (“\n press any key …”) ;
getch () ;
exit (1) ;
}