对于二进制文件,一般不能以读人字节的值是否为-1来判定二进制文件是否结束,而应该用函数feof()。 3.字符(或字节)逐一生成形成新文件的程序结构 正文文件与二进制文件的生成程序除文件打开方式不同外,它们的程序结构基本相同。字符(或字节)逐一生成输出,形成新文件的程序结构有: int c; /* 也可以是char类型 */ … /* 说明有关变量和设置初值等 */ fp = fopen(文件名,“W”); /* 或fP=fopen(文件,“wb”) */ while(还有字符(或字节)) { … /* 生成字符(或字节)存于变量c */ fpute( c,fp); /* 将生成的字符(或字节)输出 */ } fclose(fp); … /* 输出程序结束报告 */ 这里的函数fputc()的说明形式为 int fputc( char ch, FILE *fp) 该函数的功能是将ch中的字符输出到与fp文件指针相联系的文件中。函数fputc()返回一个整数值。如果输出成功,则返回值就是输出字符的ASCII代码值;如果输出失败,则返回EOF,即-1。 曾介绍过的函数putchar()是在stdio.h中用函数fputc()定义的宏: # 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个字符,或遇到换行符时,读字符过程结束。本新闻共 6页,当前在第 4页 1 2 3 4 5 6 |