首页 » C语言解惑 » C语言解惑全文在线阅读

《C语言解惑》22.3 其他读写函数

关灯直达底部

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函数类似,只是它们是以指定的文件作为读写对象的。