This is LeoTan’s homework
2022年9月19日
fopen()函数的介绍
函数原型:
FILE * fopen(const char * path,const char * mode);
//path 可以是相对路径,也可是绝对路径推荐使用相对路径,提高代码可移植性
//mode 是操作符,具体见下
mode有下列几种形态字符串:
操作符 | 用法 |
---|---|
r | 以只读方式打开文件,该文件必须存在。 |
r+ | 以可读写方式打开文件,该文件必须存在。 |
rw+ | 读写打开一个文本文件,允许读和写。 |
w | 打开只写文件,若文件存在,则该文件内容会消失。若文件不存在则建立该文件。 |
w+ | 打开可读写文件,若文件存在,则该文件内容会消失。若文件不存在则建立该文件。 |
a | 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) |
a+ | 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) |
上述的形态字符串都可以再加一个b
字符,加入b
字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
freopen() 函数的介绍
FILE *freopen(const char *filename, const char *mode, FILE *stream)
//filename 是文件路径,和fopen一样
//mode 和fopen一样
// stream 是文件流的形式,常有stderr,stdout,stdin
文件流 | 用法 |
---|---|
stderr | 运行时的错误信息输出,默认输出到错误信息文件中 |
stdout | 标准输出流,默认为命令行控制台 |
stdin | 标准输入流,默认为命令行控制台 |
当标准输出stdout
被重定向到指定文件后,如何把它重定向回原来"默认"的输出设备(即显示器)呢?
标准库的回复是:不支持。没有任何方法可以恢复原来的输出流。但可以依赖具体平台实现。
在操作系统中,命令行控制台(键盘或显示器)被视为一个文件。既然是文件,那么就有"文件名"。由于历史原因,命令行控制台文件在DOS系统和Windows操作系统中的文件名为
"CON"
,在类Linux操作系统(如Unix、Mac OS X、Android等)中的文件名为"/dev/tty"
。
所以,可以通过 fp = freopen("/dev/tty","w",stdout);
语句恢复Linux下的"默认"输出。
fopen()和freopen()的比较
fopen()
在一定程度上可以代替freopen()
,且可以比freopen()
更加方便.例如现在要对文件1.io
中输入输出:
fopen():
#include <stdio.h>
int main(){
FILE * f1 = fopen(”./1.io“,"rw");
char s[1000]= "";
fscanf(f1,"%s",s);
fprintf("%5s",s);
return 0;
}
freopen():
#include <stdio.h>
int main(){
freopen(”./1.io“,"r",stdin);
freopen("./1.io","w",stdout);
char s[1000]= "";
scanf(f1,"%s",s);
printf("%5s",s);
return 0;
}
可以看到,fopen()
使每个文件可以有一个专属对应的指针,当要对多个文件同时(或者反复)进行操作时,可以更加的方便,每个文件有一个对应的指针,也防止读写时产生混乱;
并且fopen()
不会改变标准的输入输出,也就是说其它地方使用printf()
或者scanf()
时不会被改变。
而对于freopen()
是对于标准输入输出的重定向,具有++全局性++,使用都在其他任何地方调用输入输出语句都会被影响,并且整个程序都只存在一个标准输入输出。笔者不建议使用!
本文仅供参考,如有错误,请联系作者,感激不尽!
笔者邮箱:leotan-studio@foxmail.com