输入/输出重定向
2010-03-04 23:01
232 查看
输入/输出重定向
前言在我学习
C
语言的初期,一直有个麻烦,因为打印的调试或者结果信息过多,一屏显示不下,所以很多时候我看不到前面打印出来的信息,唯一的方法就是不停地按
CTRL+ALT+PAUSE
组合键来暂停输出
~~~
有心要把它改成文件输出吧,想到要一个一个地把
printf
改成
fprintf
(那时还不懂文本编辑工具),又怕了。真想有个简单有效的办法!!!后来才知道,有个东西叫重定向———
是什么
所谓重定向就是把某应用原来的操作对象改成别的。比如说,我这个程序原来是从键盘接收信息的,现在改从一个叫
config.ini
的文件中接收信息了;本来输出的信息都显示在屏幕上的,现在我不显示在屏幕上了,我要输出到
result.txt
文本中保存起来。
怎么做
方法一:
freopen
如果你手中有源代码的话,你只需要在代码的前面加一句话:
FILE
*
stream;
stream
=
freopen(
"
out.txt
"
,
"
a+
"
, stdout );
就行了。这样,你就把程序中原定输出到屏幕的信息重定向到
out.txt
中了
,
且不覆盖
out.txt
中的内容,只是把新的输出追加在文件尾。这是一个
ANSI C
函数,所以是跨平台的。具体可以参考
MSDN
。
方法二、管道命令
如果非常不幸地,你只有可执行文件,而没有源代码可以修改,操作系统为你提供了管道命令。在
windows cmd
命令中有两个管道命令是专门用来进行
I/O
重定向的。
1.
>,>>
输出重定向命令
将一条命令或某个程序输出结果的重定向到特定文件中
, >
与
>>
的区别在于,
>
会清除调原有文件中的内容后写入指定文件,而
>>
只会追加内容到指定文件中,而不会改动其中的内容。
2.
< , >& ,
<&
输入重定向命令
<
从文件中而不是从键盘中读入命令输入。
>&
将一个句柄的输出写入到另一个句柄的输入中。
<&
从一个句柄读取输入并将其写入到另一个句柄输出中。
有了这两个,我如果想把程序中原定输出到屏幕的信息重定向到
out.txt,
且只追加不覆盖原有内容的话,就可以这样做:
command(
程序名
) >> out.txt
更进一步地,如果我想把原来打印到
stderr
和
stdout
的信息全部重定向到一个文件
out.txt
中,也可以:
command(
程序名
) >> out.txt 1>&2
这里的
1
和
2
分别是
stdout
和
stderr
在系统中的句柄,有:
STDIN 0 键盘输入 STDOUT 1 输出到命令提示符窗口 STDERR 2 错误输出到命令提示符窗口 |
T
型管道
更过分地,如果既想能够实时从屏幕上看到信息,又想能够把信息存储到一个文件中备案的话怎么办?海涛的专栏
【
3
】中提出了在
windows
系统中模拟
UINX
命令
tee
的想法。命令
tee
就像它的名字一样,充当管道
T
型接头。将输出分成两个流,一个流到文件中,另一个仍然输出到屏幕上去。真是非常形象的说法!海涛还给出了程序,但是不知道什么原因,该程序在我的机子上达不到效果,所以我对程序进行了一些小的改动,达到了目的。下面给出程序清单:
#include
<
stdio.h
>
int
main(
int
argc,
char
**
argv)
{
FILE
*
fp;
int
c;
if
( argc
>
1
)
{
fp
=
fopen(argv[
1
],
"
a+
"
);
if
( fp
==
NULL )
{
fprintf(stderr,
"
%s: can not open <%s>/n
"
, argv[
0
], argv[
1
]);
return
-
1
;
}
}
else
{
fp
=
stdout;
}
while
( (c
=
fgetc(stdin))
!=
EOF )
{
fputc(c,fp);
if
(fp
!=
stdout)
{
fputc(c,stdout);
}
}
return
0
;
}
把上面这个
程序编译连接生成tee.exe
文件后,只要使用命令:
command(
程序名
) | tee
out.txt
就可以达到目的了。
最后说明一下,上面的
|
也是一个管道运算符,它可以捕获命令的输出并作为下一个命令的输入发送。具体可以参考后面列出的参考资源。
参考资源
1.
关于文件重定向
1.1
http://book.51cto.com/art/200806/75392.htm
1.2
http://www.diybl.com/course/6_system/linux/linuxjq/2007211/17270.html
2.
关于
cmd
组合命令与管道命令
2.1
http://blog.chinaunix.net/u1/48222/showart_1080170.html
2.2
http://www.jysls.com/thread-330436-1-1.html
2.3
http://book.51cto.com/art/200811/99161.htm
3.
海涛的专栏
http://blog.csdn.net/billow_zhang/archive/2009/07/30/4392427.aspx
相关文章推荐
- Shell 输入/输出重定向
- shell脚本之重定向、标准输入、输出、错误输出的使用
- 重定向输入和输出
- shell 输入 输出重定向
- Linux教程-标准输入/输出和重定向1. 标准输入与输出
- 进程输入、输出、错误流的重定向 .
- Shell 输入/输出重定向
- OJ 调试技巧:VS2010 中 通过设置编译参数定义宏,无需修改源文件重定向标准输入输出
- C/C++输入/输出重定向
- 装载 linux shell数据输出到文件 输入与输出重定向 详细分析
- 如何判断标准输入或输出是否经过了重定向,即是否在命令行上使用了“”?
- Java重定向标准输入/输出
- linux 输入--输出--重定向 stdin/stdout/stderr
- Shell—输入/输出重定向
- Linux基础(6)标准输入输出与重定向
- linux 输入重定向和输出重定向
- 标准输入、输出和错误和文件重定向
- Linux下的输入/输出重定向
- Linux标准输入、输出和错误和文件重定向(转)
- linux 重定向输出/输入