fprintf 函数、fscanf 函数与printf函数、scanf 函数作用相仿,都是格式化读写函数。只有一点不同:fprintf和 fscanf函数的读写对象不是终端而是磁盘文件。它们的一般调用方式为
fprintf(文件指针,格式字符串,输出表列);
fscanf (文件指针,格式字符串,输入表列);
例如:
fprintf(fp,"%d,%6.2f",i,t);
它的作用是将整型变量i和实型变量t的值按%d和%6.2f的格式输出到fp指向的文件上。如果i=3,t=4.5,则输出到磁盘文件上的是以下的字符串:
3, 4.50
同样,用以下fscanf函数可以从磁盘文件上读入ASCII字符:
fscanf(fp,"%d,%f",&i,&t);
磁盘文件上如果有以下字符:
3,4.5
则将磁盘文件中的数据3送给变量i,4.5送给变量t。
用fprintf 和 fscanf函数对磁盘文件读写,使用方便,容易理解,但由于在输入时要将 ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf 和 fscanf函数,而用fread和 fwrite函数。
1. putw 和 getw函数
大多数C编译系统都提供另外两个函数:putw和getw,用来对磁盘文件读写一个字(整数)。例如:
putw(10,fp);
它的作用是将整数10输出到fp指向的文件。而
i=getw(fp);
的作用是从磁盘文件读一个整数到内存,赋给整型变量i。
如果所用的C编译的库函数中不包括putw和getw函数,可以自己定义这两个函数。putw函数如下:
putw (int i,FILE *p)
{char *s;
s=&i;
putc(s[0],fp);
putc(s[1],fp);
return(i);
}
当调用putw函数时,如果用“putw(10,fp);”语句,形参i得到实参传来的值10,在 putw 函数中将i的地址赋予指针变量s,而s是指向字符变量的指针变量,因此s指向i的第1个字节,s+1指向i的第2个字节。由于*(s+0)就是s[0],*(s+1)就是s[1],因此,s[0]、s[1]分别对应i的第1字节和第2字节。顺序输出s[0]、s[1]就相当于输出了i的两个字节中的内容。见图13.3。
getw函数如下:
getw(FILE *fp)
{char*s:
inti;
s=char*&i /*使s指向i的起始地址*/
s[0]=getc (fp);
s[1]=getc(fp);
return (i);
}
putw 和getw并不是ANSIC标准定义的函数。但许多C编译都提供这两个函数,但有的C编译可能不以putw和 getw命名此两函数,而用其他函数名,请用时注意。
2.读写其他类型数据
如果用ANSIC提供的fread 和fwrite函数,读写任何类型数据都是十分方便的。如果所用的系统不提供这两个函数,用户只好自己定义所需函数。例如,可以定义一个向磁盘文件写一个实数(用二进制方式)的函数putfloat:
putfloat (float num ,FILE * fp)
{char * s;
int count;
s=(char *)#
for(count=0;count<4;count++)
putc(s[count].fp);
}
同样可以编写出读写任何类型数据的函数。
3. fgets 函数和 fputs 函数
fgets 的作用是从指定文件读入一个字符串。如:
fgets(str,n,fp);
n为要求得到的字符,但只从fp指向的文件输入n-1个字符,然后在最后加一个'\0’字符,因此得到的字符串共有n个字符,把它们放到字符数组str中。如果在读完n-1个字符之前遇到换行符或EOF,读入即结束。fgets函数返回值为str 的首地址。
fputs 函数的作用是向指定的文件输出一个字符串。如:
fputs("China",fp);
把字符串“China”输出到fp指向的文件。fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的'\0’不输出。若输出成功,函数值为0;失败时,为EOF。
这两个函数类似以前介绍过的gets 和puts函数,只是fgets和fputs函数以指定的文件作为读写对象。