C语言中freopen函数

本文介绍了C语言中的freopen函数,该函数用于重定向输入输出流。文中提供了freopen的使用方法,包括参数说明及返回值解释,并通过两个实例展示了如何使用此函数来重定向标准输入输出到文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。


函数名:freopen
函数,以指定模式重新指定到另一个文件。模式用于指定新文件的访问方式。
头文件: stdio.h
C89函数声明:
FILE *freopen( const char *filename, const char *mode, FILE *stream );
C99函数声明:
FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);
形参说明:
filename:需要重定向到的文件名或文件路径。
mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。
stream:需要被重定向的文件流。
返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。


举例1

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int  main( void )
{
     /* redirect standard output to a file */
     if ( freopen ( "D:\\output.txt" "w" , stdout) == NULL)
         fprintf (stderr, "error redirecting stdout\n" );
     /* this output will go to a file */
     printf ( "This will go into a file.\n" );
     /*close the standard output stream*/
     fclose (stdout);
     return  0;
}
此时,D盘下将会有 This will go into a file.这几个字符。


举例2

从文件in.txt中读入数据,计算加和输出到out.txt中
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int  main( void )
{
     int  a, b;
     freopen ( "in.txt" , "r" ,stdin);
     /* 如果in.txt不在连接后的exe的目录,需要指定路径如D:\in.txt */
     freopen ( "out.txt" , "w" ,stdout);  /*同上*/
     while  ( scanf ( "%d%d" , &a, &b) != EOF)
         printf ( "%d\n" ,a+b);
     fclose (stdin);
     fclose (stdout);
     return  0;
}


当标准输出stdout被重定向到指定文件后,如何把它重定向回原来“默认”的输出设备(即显示器)呢?
C标准库的回复是:不支持。没有任何方法可以恢复原来的输出流。
那是否存在依赖具体平台的实现呢?存在。
在操作系统中,命令行控制台(即键盘或者显示器)被视为一个文件,既然是文件,那么就有“文件名”。由于历史原因,命令行控制台文件在DOS操作系统和Windows操作系统中的文件名为"CON",在其它的操作系统(例如Unix、Linux、Mac OS X、Android等等)中的文件名为"/dev/tty"。
因此,在Windows中可以使用
freopen( "CON", "w", stdout );
其它操作系统中使用:
freopen( "/dev/tty", "w", stdout );

Windows代码举例

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
int  main( void )
{
     FILE  *stream;
     if  ((stream =  freopen ( "file.txt" "w" , stdout)) == NULL)
         exit (-1);
     printf ( "this is stdout output\n" );
     stream =  freopen ( "CON" , "w" ,stdout);
     /*stdout是向程序的末尾的控制台重定向*/
     printf ( "And now back to the console once again\n" );
     return  0;
}



### C语言 `freopen` 函数的作用及用法 #### 一、`freopen` 的基本功能 `freopen` 是标准库 `<stdio.h>` 中的一个函数,用于重新定向标准输入/输出流。通过调用此函数可以将原本连接到键盘的标准输入或屏幕的标准输出重定向至指定文件[^1]。 具体来说,在程序运行期间可以通过 `freopen` 将 `stdin` 或者 `stdout` 关联到特定文件上,从而实现从文件读取数据或将输出结果保存到文件中的目的。这不仅简化了调试过程,也提高了处理大批量测试案例时的工作效率[^2]。 #### 二、语法结构与参数解释 该函数的一般形式如下所示: ```c FILE *freopen(const char *path, const char *mode, FILE *stream); ``` 其中: - `path`: 文件路径字符串,指明要打开的目标文件位置; - `mode`: 访问模式字符集,决定了是以只读方式还是可写入的方式打开文件; - `stream`: 被替换掉的原有流对象(通常是 `stdin`, `stdout`),即希望被重定位的那个I/O通道。 当成功执行后返回指向新创建文件流的指针;如果失败则保持原来的流不变并返回NULL值[^3]。 #### 三、实际应用实例展示 下面给出一段完整的代码片段来演示如何利用 `freopen` 实现输入输出重定向的功能: ```c #include <stdio.h> int main() { // 输入重定向:将 "input.txt" 设定为新的 stdin 来源 freopen("input.txt", "r", stdin); // 输出重定向:使所有后续打印都发送给 "output.txt" freopen("output.txt", "w", stdout); int n; scanf("%d", &n); // 这里的输入实际上来自 input.txt 文件 while (n--) { char buffer[1024]; gets(buffer); // 继续从 input.txt 获取一行文本 puts(buffer); // 并将其内容写入 output.txt 文件中 } fclose(stdin); // 完成操作之后记得关闭相应的文件描述符 fclose(stdout); return 0; } ``` 上述代码展示了怎样把控制台的标准输入和输出分别绑定到了两个不同的文本文件之上,使得整个交互流程完全脱离了终端界面的影响范围之外[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值