映月读书网 > C语言解惑 > 22.3 其他读写函数 >

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