1.putw和getw函数
【例22.19】下面程序给出一个奇怪的输出,找出并改正错误。
#include <stdio.h>int main(void){ int i=0,j; FILE *fp; fp=fopen (/"t.txt/",/"w/"); for(i=90;i<100;i++) putw(i, fp); for(i=0;i<10;i++) { j=getw(fp); printf(/"%d /", j); //输出80 81 ……88 89 } printf(/"n/"); fclose(fp); return 0;}
【解答】如果以这种方式写/读文件,必须在写入后关闭文件,再以读方式打开文件,才能正确读入数据。也可以将文件以“w+”方式打开,但完成文件之后,要将文件指针恢复到文件起始点,才能保证正确地读取文件内容。下面给出这种方式的实现程序,程序中将读取内容直接作为printf函数的参数。
#include <stdio.h>int main(void){ int i=0,j; FILE *fp; fp=fopen (/"t.txt/",/"w+/"); for(i=90;i<100;i++) putw(i, fp); rewind(fp); //将文件指针恢复到起点 for(i=0;i<10;i++) printf(/"%d /", getw(fp)); printf(/"n/"); fclose(fp); return 0;}
大多数C编译系统都提供了这两个函数:putw和getw。Putw函数用来对磁盘文件读写一个字(整数),getw函数从磁盘文件读一个整数赋给内存变量。如果所用的C编译的库函数中不包括putw和getw函数,可以自己定义这两个函数。同样,也可以编写出读写任何类型数据的函数。
【例22.20】下面程序读出文件的内容有误,找出并改正错误。
#include <stdio.h>int main(){ int i=0; FILE *fp; fp=fopen (/"t.txt/",/"w+/"); putw(230026, fp); putw(230039, fp); putw(024, fp); rewind(fp); for(i=0;i<3;i++) printf(/"%d /", getw(fp)); printf(/"n/"); fclose(fp); return 0;}
【解答】输出为“230026 230039 20”,024是8进制,程序用10进制数出,所以变成了20。为了区分,打印时也用8进制符号输出。将循环改为只输出2个10进制整数,另外使用8进制输出024。即改为如下形式:
for(i=0;i<2;i++) printf(/"%d /", getw(fp));printf(/"%#on/", getw(fp));
程序输出“230026 230039 024”,满足要求。
2.fgets函数和fputs函数
【例22.21】下面程序的每个输出均少了一个字符,请说明原因并改正错误。
#include <stdio.h>#include <string.h>int main(void){ char str[128],st=/"How are you?/"; FILE *fp; fp=fopen (/"t.txt/",/"w+/"); fputs(st, fp); rewind(fp); fgets(str,strlen(st),fp); printf(/"%s /", str); printf(/"n/"); rewind(fp); fgets(str,3,fp); printf(/"%s /", str); printf(/"n/"); fclose(fp); return 0;}
【解答】程序的输出结果为:
How are youHow are you?
fgets的作用是从指定文件读入一个字符串。字符串必须有结束标志,所以语句
fgets ( str,n,fp );
只能从fp指向的文件读入n-1个字符,把它们放到字符数组str中,存入一个结束标志并返回str的地址。strlen(st)计算出的是字符串的实际数目,因此少了一个字符“?”。改为语句
fgets(str,strlen(st)+1,fp);
即可输出“How are you?”。
此时fp的指针将停留在最后的n-1的位置,所以要将文件指针恢复到起始状态,才能从文件起始处再次读入字符串。理由同前,语句
fgets(str,3,fp);
只能去读2个字符,所以输出“Ho”。下一次读入则从w处开始读取,因此输出又多了一个w,将上一句改为
fgets(str,4,fp);
既可以保证输出“How”,又可以使后一句的输出为“are you?”。注意a前面有一个空格,所以结果成为如下的形式:
How are youHo are you?
fputs函数的作用是向指定的文件输出一个字符串,例如:
fputs ( /"China /",fp );
是把字符串/"China/"输出到fp指向的文件。fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针。如果输出成功,函数返回值为0;输出失败时,返回非零值。
这两个函数与gets和puts函数类似,只是它们是以指定的文件作为读写对象的。