freopen()——重定向标准输入输出流

 头文件:stdio.h


 函数原型:FILE * freopen(const char *filename , const char *type ,  FILE *stream);


例:

freopen(“in.txt”,”r”,stdin);

freopen(“out.txt”,”w”,stdout);

 参数说明


  filename: 文件名,用于存储输入输出的自定义文件名。例:"debug\\in.txt" ,可以是路径。

  type: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。

  stream: 一个文件,通常使用标准流文件。

    (这里的流不是C++中的概念,C++中的流是指对象,广义的流是指默认输入输出设备。在unix/linux系统中,所有东西都可以看成文件,所以默认输入输出设备也可以看成一个文件。

    标准流文件具体是指stdin、stdout 和stderr。

    其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。)

 返回值:如果成功则返回该指向该stream 的指针,否则为NULL。


Ps:

FILE *fp;

fp = freopen(“in.txt”,”r”,stdin);

if (fp == NULL)     //可以用这种形式来判断与文件的连接是否建立成功

cout<<”Open error!”<<endl;

  功能


  实现重定向,把预定义的标准流文件定向到由path指定的文件中。

  例如默认的标准输入流(stdin)是指向键盘,现在可以利用freopen()函数让他重定向,指向为一个文件。

  这样本来从键盘输入的数据就可以从文件中读入了。

 使用举例:


 1 #include <stdio.h>

 #include <iostream>

 using namespace std;

 int main()

 {

        FILE *fp;      

        fp = freopen("in.txt","r",stdin);      //freopen() 的返回值,如果与文件连接建立失败,返回NULL

        if(fp!=NULL){       //与文件连接建立成功

               int a;

               cin>>a;                 //从文件中读入数据

               cout<<a<<endl;      //在屏幕上显示数据

        }

        else  //建立失败

               cout<<"Open error!"<<endl;

        return ;

 }

  

 详解:


这个函数的关键是对标准输入输出流文件进行重定义。

标准输入输出流文件包括 stdin 、stdou 、stderr。

那么“流”是什么呢?

流是一个文件。它包含了对设备的描述,操作系统可以通过它对设备进行操作。可以说,他是抽象化出来的物理设备,以文件的形式展现。例如,标准输入流stdin就代表了键盘,标准输出流stdout代表了屏幕。

再抽象化一点说,“流”相当于一个桥梁,它是系统与键盘屏幕等输入输出设备交流的渠道。例如,标准输入流stdin,它一端是键盘,另一端是键盘缓冲区,数据从物理的键盘通过stdin这座桥梁传送到了缓冲区里。电脑就可以对数据进行操作了。

而freopen ()的作用就是重定向这座桥梁(“流”)。将它的一端指向为另一个文件。这样就修改了数据的导向,原来数据可能从键盘中读入,现在可能变为了从文件中读入。

 返回默认的stdout/stdin


若要返回默认的stdout/stdin,使用以下调用:

  freopen(“CON”,“w”,stdout);  //输出到控制台“CON”

检查 freopen() 以确保重定向实际发生的返回值。

//来自“百度百科 - freopen”
//下面是短程序演示了 stdout 时重定向: /*Compile options needed: none*/
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
FILE *stream ; //将内容写到file.txt, "W"是写 ("r"是读)
if((stream = freopen("file.txt", "w", stdout)) == NULL)
exit(-);
printf("this is stdout output\n");
stream = freopen("CON", "w", stdout);/*stdout 是向程序的末尾的控制台重定向*/
printf("And now back to the console once again\n");
}

 文件打开方式总结


 字符串      含义

  "r"     以只读方式打开文本文件

  "w"     以只写方式打开文本文件,已存在的将被覆盖

  "a"      以只写方式打开文本,指针指向文件尾,原文件保留

  "+"      与上面的字符串组合,表以读写方式打开(还有这个)

  "b"      与上面的字符串组合,表打开二进制文件

Freecode : www.cnblogs.com/yym2013

freopen()——重定向标准输入输出流的更多相关文章

  1. Java标准输入输出流的重定向及恢复

    在Java中输入输出数据一般(图形化界面例外)要用到标准输入输出流System.in和System.out,System.in,System.out默认指向控制台,但有时程序从文件中输入数据并将结果输 ...

  2. 重定向输入输出流--freopen

    freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流.该函数可以在不改变代码原貌的情况下改变输入输出环境. C99函数声明: FILE *freope ...

  3. Java 输入/输出——重定向标准输入/输出

    在System类中提供了如下三个重定向标准输入/输出方法. static void setErr​(PrintStream err) Reassigns the "standard" ...

  4. Java重定向标准输入/输出

    在System类中提供了三个重定向标准输入/输出的方法static void setErr(PrintStream err) 重定向“标准”错误输出流static void setIn(InputSt ...

  5. C语言学习007:重定向标准输入和输出

    先来完成一个将输入数据转换成json格式输出的小任务 #include <stdio.h> int main(){ float latitude; float longtitude; ]; ...

  6. IO流(三)__字节流 标准输入输出流 转换流

    一.字节流:FileInputStream 和FileOutputStream 基本操作和字符流类相同,没有flush,但是close还是要的 复制一个字节流文件 private static voi ...

  7. 黑马程序员——JAVA基础之标准输入输出流

    ------- android培训.java培训.期待与您交流! ---------- 标准输入输出流: System中的基本字段,in,out 它们各代表了系统标准的输入和输出设备. 默认输入设备是 ...

  8. Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

    1.操作基本数据类型的流     1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...

  9. Java精选笔记_其他IO流(ObjectInputStream、DataInputStream、PrintStream、标准输入输出流)

    其他IO流 ObjectInputStream和ObjectOutputStream 如果希望永久将对象转为字节数据写入到硬盘上,即对象序列化,可以使用ObjectOutputStream(对象输出流 ...

随机推荐

  1. java链接到mysql

    原文出自 http://qq163230530.blog.163.com/blog/static/4289250620081186262719/ eclipse 下载安装后 新建web项目 首先配置服 ...

  2. js校验表单后提交表单的三种方法总结

    第一种: 复制代码 代码如下: <script type="text/javascript">         function check(form) { if(fo ...

  3. Windows下绘制数学函数图像的方法

    一.安装相关软件 在Windows中安装VirtualBox: 在VirtualBox中安装Ubuntu Server: 在Ubuntu Server中安装cifs-utils:sudo apt-ge ...

  4. 把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方。Duplicate entry

    把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方.Duplicate entry ’3′ for key ‘PRIMARY’ 你的主键是不 ...

  5. rsync+inotify 实现服务器之间目录文件实时同步(转)

    软件简介: 1.rsync 与传统的 cp. tar 备份方式相比,rsync 具有安全性高.备份迅速.支持增量备份等优点,通过 rsync 可 以解决对实时性要求不高的数据备份需求,例如定期的备份文 ...

  6. 分布式缓存BeIT Memcached简介(转载)

    或许你还没有用到过分布式缓存,在web集群的情况下,它可以很好的让一部分常用数据常驻服务器内存而不用担心各台web不同步.下 面稍微介绍一下beitmemcached对于.net的支持,官方参考htt ...

  7. C#原始类型扩展方法—this参数修饰符

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual ...

  8. 用WP_Query自定义WordPress 主循环

    我们知道操作 WordPress 主循环(WordPress Loop)最容易的方法是使用 query_posts 函数. 但是使用 query_posts 直接修改 WordPress 默认的主循环 ...

  9. 搭建openfire Android 客户端学习和开发【二】spark源码导入eclipse

    首先声明下 这是我在eoe上转载的 写的很好就摘抄了... 第一步 下载源码 svn下载,下载地址:spark:http://svn.igniterealtime.org/svn/repos/spar ...

  10. 淘宝(阿里百川)手机客户端开发日记第七篇 Service,Handler和Thread

    现在我们已经已经知道android有Service,Handler和Thread这些内容了,但是我想应该还有很多人对此并不是很清楚他们之间的区别! (1)Service 是运行在后端的程序,不与UI直 ...