# define putchar(c) fputc(c, stdout)
用宏putchar(c) 比写fputc(c,stdout) 在概念上更简单一些。从使用者来说,可以把putchar(c) 看作函数调用,不必严格地称它为宏调用。
4. 数据成块输入/输出函数
为加快程序的处理速度,程序可以成批地读人文件中的数据,也可成批地写数据到文件。它们是函数fread()和fwrite()。
成批读函数fread()的说明形式为
int fread(char *buf,int size, int count, FILE *rfp);
成批写函数fwrite() 的说明形式为
int fwrite( char *buf, int size, int count,FILE *wfp);
其中,buf是字符数组首元指针。对fread()来说,它是读人数据的存放开始地址;对bote()来说,是要输出数据的开始地址。size是读写的数据块的字节数。count为要进行读写的数据块的个数。rfp和wfp为文件指针。调用上述函数共读写size。 count个字节或字符。函数fread()和fwrite()的返回值是实际完成输入或输出的数据块的个数。一般情况下,输出调用成功,返回值为count的值。
如果是读写二进制文件,用函数fread()和fwrite()可以读写任何类型的信息。如有一个如下形式的通信录结构类型:
typedef struct {
char name[21]; /* 名字 */
char phone[15]; /* 电话 */
char zip[10]; /* 邮编 */
char addr[31]; /* 地址 */
} infoType;
利用类型infoType,可定义数组,如:
infoType info[30];
表示结构数组info[]能存放30个通信录数据。而下面的两个函数调用能分别实现20个通信录信息从某文件读出和写入某文件:
fread( info,sizeof(infoType),20,rfp);
fwrite( info,sizeo(infoType),20,wfp);
5.格式输入/输出库函数
与用函数scanf()从标准设备输入和用函数printf()向标准设备输出一样,一般文件也可进行格式输入和格式输出。
函数fscanf()和fprintf()分别能对一般文件进行格式输入和格式输出。它们的调用形式分别为
fscantf(文件指针,格式字符串,输入项地址表)
和
fprintf(文件指针,格式字符串,输出项表)
例如,
fscanf(rp,"%d%f",&i,&r);
fprintf(wp,"i=%d, r=%6.4f\n", i,r);
前者表示从与叩相联系的文件为变量i和r读人数据;后者表示将整型变量i和实型变量r的值按格式输出到与呷相联系的文件上。
6.字符串输入/输出库函数
函数fgets()和fputs()分别用于从正文文件输入字符串和向正文文件输出字符串。它们的说明形式分别为
char *fgets(char *str,int n, FILE *fp)
和
fputs(char *str, FILE *fp)
函数fgets() 用于从文件读取字符序列,并存于字符指针所指出的存储区域中。当连续读人n-1个字符,或遇到换行符时,读字符过程结束。
函数fgets()与函数gets()都在读人的字符序列之后自动存储字符串结束标记'\0',使其成为字符串,并返回字符率的首字符指针。但它们有差别,函数fgets()除增加整型参数和文件指针参数之外,还在读到换行符时,存储换行符,而函数gets()不存储换行符。
函数fputs()的作用是将字符串复制到文件。其中字符串的结束标记符是不复制的,也不在复制的字符序列之后另外再添加换行符,这一点与函数puts()不同。