C语言流重定向的两种方式

1.利用控制台命令(以windows为例)

代码:

#include<stdio.h>

int main()
{
	char c;
	while((c = getchar())!=EOF && c!='\n')
	{
		putchar(c);
	}
	return 0;
}

那么如何利用控制台重定向呢?请看控制台运行截图:


在程序后加>输出流名称,即为重定向标准输出流到输出流名称这个流,加<输入流名称,即可重定向标准输入流到输入流名称这个流


运行结果截图

限制:只能重定向标准输入输出流,且分别只能打开一个文件流。


2.利用freopen重定向打开库函数

代码:

#include<stdio.h>

int main(void)
{
	char c;
	if(freopen("stdin.txt","r",stdin) == NULL) //将标准输入流重定向至stdin.txt流 
	{
		fprintf(stderr,"打开文件失败!");
		exit(-1);
	}
	if(freopen("stdout.txt","w",stdout) == NULL)//标准输出流重定向至stdout.txt流
	{
		fprintf(stderr,"打开文件失败!");
		exit(-1);
	}
	while((c = getchar())!=EOF && c!='\n')
	{
		putchar(c);
	}
	return 0;	
}

运行结果截图

freopen用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。相对于控制台命令具有更好的灵活性,且可指定打开流的模式(如“r”只读模式);

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。

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

猜你喜欢

转载自blog.csdn.net/g1093896295/article/details/79554448