freopen函数

功能

使用不同的文件或模式重新打开流,即重定向。

实现重定向,把预定义的标准流文件定向到由path指定的文件中。(直观感觉/实际操作都像是把文件定向到流,难道是说,对流来说就是重定向,大雾)。

如果指定了新文件名,则该函数首先尝试关闭已与stream(第三个参数)关联的任何文件并取消关联。然后,无论该流是否成功关闭,freopen都会打开由filename指定的文件,并将其与流关联,就像fopen使用指定的模式一样。(先记住后面有用)

参数

文件名

即要打开的文件的名字。

其值应遵循运行环境的文件名规范,并且可以包含路径(如果系统支持)。

模式

使用上面的模式说明符,文件将作为文本文件打开。为了打开一个文件作为二进制文件中,“b”的字符必须被包括在模式串。这个附加的“b”字符可以附加在字符串的末尾(从而产生以下复合模式:“rb”,“wb”,“ab”,“r + b”,“w + b”,“a + b“)或插入字母和混合模式的”+“符号之间(”rb +“,”wb +“,”ab +“)。

流

这里主要用标准流文件,标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。

实例

这个方法的好处十分明显,freopen之后,就能像平常一样使用scanf,printf,cin,cout

清单一:C++版

 #include<iostream>
using namespace std; int main()
{
int a, b;
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
while (cin >> a >> b)
cout << a + b << endl;
fclose(stdin);
fclose(stdout); return ;
}

清单二:C版

 #include<iostream>
using namespace std; int main()
{
int a, b;
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
while (scanf("%d%d", &a, &b) == )
printf("%d\n", a + b);
fclose(stdin);
fclose(stdout); return ;
}

清单三:带路径的输入输出文件

我用的VS2017,默认在工程文件夹下,只要路径写对,可以在任意文件夹下(本人测试只能放在该工程文件夹下的任意文件夹)

 #include<iostream>
using namespace std; int main()
{
int a, b;
freopen("in.txt", "r", stdin);
freopen("Debug\\out.txt", "w", stdout);
while (scanf("%d%d", &a, &b) == )
printf("%d\n", a + b);
fclose(stdin);
fclose(stdout); return ;
}

清单四:竞赛常用版

比如,杭电1000题我完全可以这样提交:

#include <stdio.h>
#include <iostream> using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int a,b;
while(cin>>a>>b)
cout<<a+b<<endl;
return ;
}

在本地机器调试时,因为没有定义过ONLINE_JUDGE,所以会执行freopen("in.txt","r",stdin);方便本机上的调试,当提交到OJ上后,因为有了ONLINE_JUDGE的定义,所以跳过语句freopen("in.txt","r",stdin); 从 int a,b;处开始执行。

freopen的“关闭”

在写代码时常出现这种情况:我们从原有文件使用freopen导入数据,但之后关闭文件再次从键盘输入。我们如果直接fclose(stdin),之后的键盘输入肯定不管用。应如何解决?

显然,如果在使用完freopen之后,如果还需要使用标准输入输出,不能把它们直接fclose。

我们不妨再次重定向,把stdin、stdout重定向到控制台,就能从键盘接受输入、从屏幕输出。

 #include<iostream>
using namespace std; int main()
{
int a, b;
freopen("in.txt", "r", stdin);
freopen("Debug\\out.txt", "w", stdout);
while (scanf("%d%d", &a, &b) == )
printf("%d\n", a + b);
//fclose(stdin);
//fclose(stdout);
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
printf("Hello World\n");
scanf("%d%d", &a,&b); return ;
}

需要注意,这里其实没有真正关闭,只是再次重定向,回到控制台。

在windows/DOS,读文件后用freopen("CON", "r", stdin),写文件后  freopen("CON", "w", stdout)。

在linux中,控制台设备是 /dev/console:freopen("/dev/console", "r", stdin)。

参考链接:

1、https://blog.csdn.net/SJF0115/article/details/7695723

2、http://www.cplusplus.com/reference/cstdio/freopen/

3、https://blog.csdn.net/xylon_/article/details/81257268

4、https://zhidao.baidu.com/question/475250525.html

5、http://www.voidcn.com/article/p-ymjofuqn-rs.html

freopen()重定向的打开和关闭的更多相关文章

  1. 文件流之输入输出(类似于freopen重定向)

    利用标准文件操作函数进行数据的输入输出,所用函数均在stdio.h中,类似于freopen重定向文件. 该方法的思路是: (1)建立文件指针 (2)打开文件,将文件指针指向打开的文件,并决定打开的文件 ...

  2. Linux C编程--打开和关闭流

    以下函数用于打开和关闭一个流.#include <stdio.h>FILE * fopen (const char *pathname, const char *opentype);int ...

  3. RMS Server打开或关闭日志记录

    原文: https://technet.microsoft.com/zh-cn/library/cc732758 在 Active Directory Rights Management Servic ...

  4. iOS-OC-APP热更新,动态更新(仿QQ打开或关闭某个功能)

    一.前言 iOS开发更新APP我觉得是比较坑的就是审核时间比较长,审核比较严,对于刚入行的小伙伴来说,雷区比较多:所以热更新是比较重要的: 大家也许会发现我们常用的QQ现在下来也就一百多兆,但是用了几 ...

  5. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

    迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...

  6. [Flex] PopUpButton系列 —— 打开和关闭弹出菜单

    <?xml version="1.0" encoding="utf-8"?><!--响应打开和关闭弹出菜单的例子 PopUpButtonOpe ...

  7. Linux C 文件与目录2 文件的打开与关闭

    文件的打开与关闭 open和close 文件的打开指的是从磁盘中找到一个文件,返回一个整形的打开文件顺序的编号.打开的文件处于可读.可写状态.文件的关闭指的是释放打开的文件,是文件处于不可读写的状态. ...

  8. android 输入法的打开和关闭

    一.打开输入法窗口: InputMethodManager inputMethodManager = (InputMethodManager)  getSystemService(Context.IN ...

  9. 如何打开和关闭Oracle Flashback

    1.打开flashback: 关闭数据库 SQL>shutdown immediate; 启动到mount方式 SQL>startup mount; 如果归档没有打开,打开归档[因为fla ...

随机推荐

  1. caioj1270: 概率期望值1:小象涂色

    DP深似海,得其得天下.——题记 叕叕叕叕叕叕叕叕叕叕叕(第∞次学DP内容)被D飞了,真的被DP(pa)了.这次D我的是大叫着第二题比较难(小象涂色傻b题)的Mocha(zzz)大佬,表示搞个概率DP ...

  2. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  3. Bootstrap中的字体图标

    使用 <span class="glyphicon glyphicon-th-large"> XX文字</span>引入字体图标.一般情况下文字放在span ...

  4. HDU 5945 Fxx and game (DP+单调队列)

    题意:给定一个 x, k, t,你有两种操作,一种是 x - i (0 <= i <= t),另一种是 x / k  (x % k == 0).问你把x变成1需要的最少操作. 析:这肯定是 ...

  5. 基于ssh框架web示例

    基于ssh框架web示例 介绍 Spring Boot Web 开发非常简单,该示例包括包括目前web开发基本都需要用到的内容 - 序列化(json)输出 - 过滤器(filters) - 监视器(l ...

  6. spring boot启动报错Error starting ApplicationContext(未能配置数据源)

    主要错误:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource c ...

  7. JDBC中的DriverManager.getConnection(url)中的参数url

    1.Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); ...

  8. win7/8系统中php5.3和5.4、5.5不能加载php_curl.dll解决办法

    win7/8系统中php5.3和5.4.5.5不能加载php_curl.dll解决办法   作者:用户 来源:互联网 时间:2016-06-23 18:54:33 php变量注释系统模块 摘要: 本文 ...

  9. Hdu 5352 MZL's City (多重匹配)

    题目链接: Hdu 5352 MZL's City 题目描述: 有n各节点,m个操作.刚开始的时候节点都是相互独立的,一共有三种操作: 1:把所有和x在一个连通块内的未重建过的点全部重建. 2:建立一 ...

  10. 1.1.2最小生成树(Kruskal和Prim算法)

    部分内容摘自 勿在浮沙筑高台 http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意 ...