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

fopen与freopen相关推荐

  1. 打开流 fopen 、freopen和fdopen函数

    打开流 fopen .freopen和fdopen函数 转载 2015-12-21 14:13:07 fopen .freopen和fdopen函数作用都是打开一个标准I/O流的,但是它们有一些略微的 ...

  2. freopen函数的使用以及freopen与fopen的区别 open、fopen、freopen区别(文件操作)

    freopen函数的使用以及freopen与fopen的区别 https://www.cnblogs.com/hi3254014978/p/11450960.html freopen函数的使用:参见这 ...

  3. Linux C/C++编程: 文件操作open/close、fopen与freopen/fclose

    open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系 ...

  4. Clibrary | 【02】文件访问fclose、fflush、fopen、freopen、setbuf、setvbuf

    前言 以下是<cstdio>对文件访问的函数. 文章目录 前言 1.fclose 2.fflush 3.fopen 4.freopen 5.setbuf 6.setvbuf 1.fclos ...

  5. fopen和freopen

    经常会遇到文件操作,这时,从文件输入和输出到文件不可少. freopen函数用来重定向输入和输出,不过这个函数有个缺点:只能输入和输出只能定向到一个文件,比如fp1=freopen("dat ...

  6. linux c open fopen freopen 文件操作函数

    open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系 ...

  7. win10环境下c语言打开文件失败,cfile fopen fopen_s win10下打开文件失败

    vc程序在win10下面使用fopen 打开文件失败,在网上查 了下是因为UAC权限的问题如下: 由于windows vista win7 win8 win 10 添加了UAC权限,所以会导致 在系统 ...

  8. C语言输入输出重定向与fopen函数使用详解

    大多数情况下,我们所熟知的输入输出都是标准I/O(标准输入输出),也就是我们在写代码时会直接从键盘读取,从屏幕输出.但是当我们涉及到数据统计或者多组未定义内容输入时,我们的程序就会出现一些小问题 in ...

  9. C语言合理字符的代码,改善C语言程序代码的125个建议,第62到89个建议!

    大家好,我是阿叔,专注分享产品.研发.管理等相关经验. 一共有125个改善C语言程序的建议,因为篇幅的原因,本文将第62到89个建议.其他的建议再下几篇文章发布. 7. 结构.位域和枚举 建议62:结 ...

最新文章

  1. mybatis基础(一)
  2. 爬出数据标注陷阱,半监督学习模型暗藏多少玄机?
  3. Macbook使用技巧,分享必备
  4. 【代码优化】注解优先命名模式
  5. 黑马java架构师课_【黑马精品】Java架构师实战训练营
  6. QTcpServer和QTcpSocket使用详解
  7. mac地址被路由器拉黑_我买了一个新路由器,告诉我我被黑了
  8. 解决Tomcat严重: Parse error in application web.xml file at jndi:/localhost/ipws/WEB-INF/web.xml java.lan
  9. UML之工具篇(Win10无法使用VGAPlayer播放asf格式与VGA课件的解决办法)
  10. python的输入函数是什么意思_在Python中,用于获取用户输入的函数是
  11. html 表格 锁定首行,教你实现首行及首列固定 Table
  12. 如何安装 zlib-dev
  13. C语言实验——整除 (sdut oj)
  14. java使用geotools读取shp文件
  15. 【附源码】计算机毕业设计java疫情期间优化旅游平台设计与实现
  16. 什么是JWT及在JAVA中如何使用?
  17. 安全服务实习生培训计划
  18. C语言结构体工资缴税,C语言进阶-第11~13讲:结构体实践(成绩处理个税计算器之码数分离)...
  19. 《社会调查数据管理——基于Stata 14管理CGSS数据》一3.2 和统计有关的术语
  20. 缠论学习记录 - 查漏补缺

热门文章

  1. Battery Historian2.0 windows下安装
  2. 安装文件Win7 配置 Nutch 1.2
  3. 南方东英美元市场货币ETF(股份代号:9096.HK)获惠誉“AAAf”评级
  4. 聚类算法实践(1)——层次、K-means聚类
  5. GameFramework框架详解之 Resource资源管理器
  6. EOF-DataScience:数据预处理/特征工程之线性变换—四种特征缩放Scaling算法简介、标准化standardization、归一化Normalization的概述与区别
  7. 让运动更流畅、更优雅、更丰富——雅酷互动flash as2简易教程第3篇
  8. [读书]互联网让你变聪明还是变傻?
  9. 20172303 2018-2019-1 《程序设计与数据结构》实验一报告
  10. html怎样加粗直线,html字体怎么加粗