fopen与freopen

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leotan2004

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值