freopen重定向函数

函数名:freopen
声明:FILE *freopen( const char *path, const char *mode, FILE *stream );
所在文件: stdio.h
参数说明:
path: 文件名。
mode: 文件打开的模式。和fopen中的模式(如r, w,)相同。
stream: 一个文件,通常使用标准流文件(stdin, stdout, stderr)。
返回值:成功,则返回一个path所指定的文件的指针。失败,返回NULL。(一般都不使用它的返回值)

功能:简单说,就是实现重定向。把预定义的几个标准流文件(stdin, stdout, stderr)定向到由path指定的文件中。
freopen("debug\\in.txt","r",stdin)的作用就是把stdin重定向到debug\\in.txt文件中,这样在用cin或是
用scanf输入时便不会从标准输入流提取数据。而是从in.txt文件中获取输入。只要把输入事先粘贴到
in.txt,调试时就方便多了。
举个例子:
FILE *fp;
fp=freopen("in.txt","r",stdin);              对比: fp=fopen("in.txt","r");
while(!feof(fp))                                  while(!feof(fp))
{                                                  {
   scanf("%%....",&,&....);                           fscanf(fp,"%%....",&,&....);
   printf("%%....",....);                              ...............
}                                                  }
同理
freopen("out.txt","w",stdout);
是打开(新建)一个名字为out.txt的文本,然后可以再这个文本中输入(打印)数据;
说到这里,对比一下fopen,fdopen,freopen这三个相似的函数
他们的区别如下:

#include <stdio.h> 
FILE *fopen(const char *path, const char *mode); 
FILE *fdopen(int fildes, const char *mode); 
FILE *freopen(const char *path, const char *mode, FILE *stream);


DESCRIPTION 描述
函数 fopen 打开 一个 文件, 并且 分配 一个 流, 文件名 由 字符串 path 指定. 
参数 mode 指向 一个 字符串, 该 字符串 用 下面 的 字符串 开头 (之后 可以有 附加的 字符):


为 读操作 打开 文本文件. 流 被定位于 文件 的 开始. 
r+ 
为 读写操作 打开 文本文件. 流 被定位于 文件 的 开始. 

为 写操作 创建 文本文件, 或者 将 已经 存在的 文件长度 截断为 零. 流 被定位于 文件 的 开始. 
w+ 
为 读写操作 打开 文件. 如果 文件 不存在, 就 创建 它, 否则 将它 截断. 流 被定位于 文件 的 开始. 

为 追加操作 (在文件尾写) 打开 文件. 如果 文件 不存在, 就 创建 它. 流 被定位于 文件 的 末尾. 
a+ 
为 追加操作 (在文件尾写) 打开 文件. 如果 文件 不存在, 就 创建 它. 读文件的初始位置 是 文件 的 开始, 但是 写文件 总是 被追加到 文件 的 末尾.

可以 把 字母 ``b'' 添加到 字符串 mode 的 末尾, 或者 插到 上面 任何 两个字符的 字符串 的 中间. 这样 只是 为了 和 ANSI X3.159-1989 (``ANSI C'') 标准 严格 保持 兼容, 没有 实际的 效果; 在 所有遵循 POSIX 的 系统 中, ``b'' 都 被忽略, 包括 Linux. (其他系统 可能会 分别对待 文本文件 和 二进制文件, 如果 在 进行 二进制文件 的 I/O, 那么 添加 ``b'' 是个 好主意, 因为 你的程序 可能会 被移植到 非 Unix 环境中.)

任何 新建文件 的 访问模式 是 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH (0666), 并且 用 进程的 掩码值 umask 加以修改 (参见 umask(2)).

在 读/写流 上 可以 任意 顺序 混合 进行 读写操作. 注意 ANSI C 要求 在 输出和输入操作 之间 插入 一个 文件定位函数, 除非 输入操作遇到了 文件结束符. (如果 不是 这种情况, 那么 读操作 总是 返回 写操作 的 结果而不是 最后的 内容.) 因此, 最好 (在 Linux 中 有时 是必须的) 对 这样的流 的 写/读操作 之间 加入 一个 fseek 或是 fgetpos 操作. 这个操作 可以 是一个 空操作 (如 fseek(..., 0L, SEEK_CUR)), 只利用其 文件同步 这个 副效应.

用 追加方式 打开 文件 (a 作为 mode 的 第一个 字符) 将使得 所有后续的 写操作 发生在 文件末尾, 如同 之前 调用了

fseek(stream,0,SEEK_END); 
一样. 
fdopen 函数 将 一个流 和 已存在的 文件描述符 fildes 联系 起来. 流的 操作模式 mode (取值为 "r", "r+", "w", "w+", "a", "a+" 之一) 必须 与 该文件描述符 的 操作模式一致. 流的 定位标识 设置为 fildes 原有的值, 清除 错误标记 和 文件结束标记. 模式 "w" 或者 "w+" 不会 截断 文件. fdopen 不复制 文件描述符, 在关闭 fdopen 创建的 流 时, 也不关闭 该文件描述符. 对 共享内存对象 实施 fdopen 的 结果 没有定义.

freopen 函数 打开 用 path 说明 的 文件, 并且 和 stream 指定的流 联系 起来. 原来的流 (如果 存在的话) 被关闭. 参数 mode 和 fopen 中的 用法 一样. freopen 函数 主要的用处 是 改变 标准文本流 (stderr, stdin, 或 stdout) 联系 的 文件.


RETURN VALUE (返回值)
如果 操作 成功, fopen, fdopen 和 freopen 返回 一个 指向 文件对象 FILE 的 指针, 否则 返回 NULL 并 设置 全局变量 errno 来 指出 错误的发生.

ERRORS
EINVAL 
fopen, fdopen, 或 freopen 提供的 参数 mode 无效. 
fopen, fdopen 和 freopen 也有可能 失败 并置 errno 为 malloc(3) 指定的值.

fopen 也有可能 失败 并置 errno 为 open(2) 指定的值.

fdopen 也有可能 失败 并置 errno 为 fcntl(2) 指定的值.

freopen 也有可能 失败 并置 errno 为 open(2), fclose(3) 和 fflush(3) 指定的值.


CONFORMING TO (标准参考)
fopen 和 freopen 函数 遵循 ANSI X3.159-1989 (``ANSI C'') 标准. fdopen 遵循 IEEE Std1003.1-1988 (``POSIX.1'') 标准

转载URL:http://hi.baidu.com/%CF%F4%B1%EA/blog/item/667b6359530a048d810a18d9.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值