文件操作
我们可以通过下面的方式声明一个文件指针。
FILE *fp;
这时候,如果我们希望对一个文件进行操作,我们需要先使用
fp = fopen(文件路径, 访问模式);
将文件指针和文件关联起来,其中第一个参数是一个字符串,对应了我们希望访问的文件路径。第二个参数是访问模式,它可以是表示只读模式的”r”,也可以是表示只写模式的”w”,还可以是在文件末尾追加的”a”。
当我们将文件指针和文件关联起来后,我们就可以通过fgetc(fp);获得当前指针之后位置的一个字符了,每获得一个字符,指针会向后移动一个字符(如果到达文件尾部则会返回EOF)。
我们这时通过fputc(‘c’, fp);的方式将字符’c’写入到fp关联的文件内了。
了解到这些信息后,我们就可以实现将一个文件复制到另一个文件内的函数了,例如:
void filecopy(FILE *in_fp, FILE *out_fp) {
char ch;
while ((ch = fgetc(in_fp)) != EOF) {
fputc(ch, out_fp);
}
}
这个函数接收的两个参数都是文件指针。这个函数会通过一个可读模式的文件指针逐字符地读取,并且通过一个可写模式的文件指针逐字符地将所有字符写出,从而起到复制文件内容的作用。
你需要注意,在给文件指针进行命名的时候,要避开 stdin、stdout 和 stderr 这三个名称。因为这三个名称其实已经用于标准输入、标准输出、标准错误的文件指针。
你可能会问了,那我们看到的 stdin、stdout 和 stderr 的这三个文件指针可以直接使用吗?回答是肯定的。
我们是通过 fgetc(stdin); 获得来自标准输入的字符,也可以通过 fputc(ch, stdout); 或 fputc(ch, stderr); 将变量 ch 中的字符输出到标准输出或标准错误中的。
除了fgetc和fputc之外,我们还可以使用fscanf和fprintf函数。这两个函数都很像我们已经很熟悉的scanf和printf函数,只是不过,scanf和printf 可以被看作 fscanf和fprintf 的特例。
我们使用 fscanf 从文件指针in_fp进行读取时,可以写成:
fscanf(in_fp, "%c", &a);
而如果我们写
fscanf(stdin, "%c", &a);
这将完全与下面直接使用 scanf 的方式等价。
scanf("%c", &a);
类似地,我们使用fprintf向文件指针out_fp进行写出时,可以写成:
fprintf(out_fp, "%c", a);
而如果我们写
fprintf(stdout, "%c", a);
这将完全与下面直接使用 printf 的方式等价。
printf("%c", a);
在使用文件并且确定不再继续使用后,我们要通过下面所示的方式将文件指针fp与文件的关联断开。你可以将它视为和fopen相反的一个操作。
fclose(fp);
如果你不在程序中使用fclose,程序正常结束时,程序会为所有打开的文件调用fclose。
stdin、stdout 其实也是被打开的文件指针,如果你觉得用不到的话,其实也是可以使用 fclose 将他们关闭掉的。你可以自己试一试,关闭 stdin、stdout 会对我们以前写过的程序带来什么样的影响呢
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76941.html