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