前面章节介绍的
I/O
函数都类似于文件
I/O
函数。它们的主要区别是,文 件I/O
函数要用
FILE
指针指定待处理的文件。与
getc()
、
putc()
类似,这些函数都要求用指向 FILE
的指针(如,
stdout
)指定一个文件,或者使用
fopen() 的返回值
fprintf()
和
fscanf()
函数
文件
I/O
函数
fprintf()
和
fscanf()
函数的工作方式与
printf()
和
scanf()
类似, 区别在于前者需要用第1
个参数指定待处理的文件。我们在前面用过 fprintf()。程序清单
13.3
演示了这两个文件
I/O
函数和
rewind()
函数的用法。
程序清单
13.3 addaword.c
程序
/* addaword.c -- 使用 fprintf()、fscanf() 和 rewind() */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 41
int main(void)
{
FILE *fp;
char words[MAX];
if ((fp = fopen("wordy", "a+")) == NULL)
fprintf(stdout, "Can't open \"wordy\" file.\n");
exit(EXIT_FAILURE);
puts("Enter words to add to the file;
press the #");
puts("key at the beginning of a line to terminate.");
while ((fscanf(stdin, "%40s", words) == 1) && (words[0] != '#'))
fprintf(fp, "%s\n", words);
puts("File contents:");
rewind(fp); /* 返回到文件开始处 */
while (fscanf(fp, "%s", words) == 1)
puts(words); puts("Done!");
if (fclose(fp) != 0)
fprintf(stderr, "Error closing file\n");
return 0;
}
该程序可以在文件中添加单词。使用
"a+"
模式,程序可以对文件进行读 写操作。首次使用该程序,它将创建wordy
文件,以便把单词存入其中。随后再使用该程序,可以在wordy
文件后面添加单词。虽然
"a+"模式只允许在文件末尾添加内容,但是该模式下可以读整个文件。rewind()函数让程序回到文件开始处,方便while循环打印整个文件的内容。注意,rewind()接受一个文件指针作为参数。
下面是该程序在
UNIX
环境中的一个运行示例(可执行程序已重命名为
addword
):
$ addaword Enter words to add to the file;
press the Enter key at the beginning of a line to terminate.
The fabulous programmer #File contents:
The fabulous programmer Done! $ addaword Enter words to add to the file;
press the Enter key at the beginning of a line to terminate. enchanted the large
如你所见,
fprintf()
和
fscanf()
的工作方式与
printf()
和
scanf()
类似。但
是,与 putc()不同的是,
fprintf()
和
fscanf()
函数都把
FILE
指针作为第
1
个参
数,而不是最后一个参数
fgets()
和
fputs()
函数
fgets()
函数。它的第
1
个参数和
gets()
函数一样,也是表 示储存输入位置的地址(char * 类型);
2
个参数是一个整数,表示待输 入字符串的大小
[1]
;最后一个参数是文件指针,指定待读取的文件。下面 是一个调用该函数的例子: fgets(buf, STLEN, fp);
这里,
buf
是
char
类型数组的名称,
STLEN
是字符串的大小,
fp
是指向 FILE的指针。 fgets()函数读取输入直到第
1
个换行符的后面,或读到文件结尾,或者 读取STLEN-1
个字符(以上面的
fgets()
为例)。然后,
fgets()在末尾添加一个空字符使之成为一个字符串。字符串的大小是其字符数加上一个空字符。如果fgets()在读到字符上限之前已读完一整行,它会把表示行结尾的换行符
放在空字符前面。
fgets()
函数在遇到
EOF
时将返回
NULL
值,可以利用这一机 制检查是否到达文件结尾;如果未遇到EOF
则之前返回传给它的地址。
fputs()
函数接受两个参数:第
1
个是字符串的地址;第
2
个是文件指针。 该函数根据传入地址找到的字符串写入指定的文件中。和 puts()
函数不同, fputs()在打印字符串时不会在其末尾添加换行符。下面是一个调用该函数的 例子:fputs(buf, fp);
这里,
buf
是字符串的地址,
fp
用于指定目标文由于fgets()
保留了换行符,
fputs()
就不会再添加换行符,它们配合得非常好。