前面章节介绍的 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() 就不会再添加换行符,它们配合得非常好。
本文含有隐藏内容,请 开通VIP 后查看