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 you Ho w 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 you Ho are you ?
fputs函数的作用是向指定的文件输出一个字符串,例如:
fputs ( \"China \" ,fp );
是把字符串\"China\"输出到fp指向的文件。fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针。如果输出成功,函数返回值为0;输出失败时,返回非零值。
这两个函数与gets和puts函数类似,只是它们是以指定的文件作为读写对象的。