设为首页 加入收藏

TOP

C++ stderr/stdout 重定向到文件
2015-07-16 12:55:50 来源: 作者: 【 】 浏览:34
Tags:stderr/stdout 定向 文件

通常,stderr和stdout被用来输出内容显示到屏幕,但是,有时候我们需要把这些信息写到指定的文件,方便随时查阅。最简单的实现方式就是,把 stderr/stdout 的输出重定向到文件。


stderr/stdout 重定向到文件


这里以stderr代码说明。


#include
#include


int main( void )
{
?FILE *stream = freopen( "freopen.out", "w", stderr );


?if( stream == NULL )
? fprintf( stdout, "error on freopen\n" );
?else
?{
? fprintf( stdout, "successfully reassigned\n" ); fflush( stdout );
? fprintf( stream, "This will go to the file 'freopen.out'\n" );
? fprintf( stderr, "Also you can do it like this!\n" );
? fclose( stream );
?}


?// windwos下读取文件 freopen.out
?system( "type freopen.out" );
?getchar();
?return 0;
}


执行结果如下,


C++ stderr/stdout 重定向到文件


stderr与stdout的区别


stdout(标准输出),输出方式是行缓冲。输出的字符会先存放在缓冲区,等按下回车键时才进行实际的I/O操作。


stderr(标准出错),是不带缓冲的,这使得出错信息可以直接尽快地显示出来。


关于缓冲的说明:


然而就缓冲来说,stdout与stderr没有绝对的区别,因为缓冲类型可以设定。这里要借助?setvbuf() 或 setbuf() 函数。


?


#include ?
#include ?
?
int main( void )?
{?
? ?
?char buf[512] = {0};
?setbuf(stderr, buf);
?fprintf(stderr, "It is error 1\n");
?printf("echo 1\n");
?fprintf(stderr, "It is error 2\n");
?printf("echo 2\n");
?fprintf(stderr, "It is error 3\n");


?


?fflush(stderr);


?


?getchar();
?return 0;
}?


运行结果如下:


C++ stderr/stdout 重定向到文件


这样,我们就可以定义缓冲区大小。缓冲区默认大小由 stdio.h 头文件中的宏 BUFSIZ 定义,是512字节。另外,查阅一些资料说最小不能低于256字节,但测试例子没有这个问题(暂时没有深究)。


setvbuf() 与 setbuf()


setvbuf() 函数原型如下:


int setvbuf ( FILE * stream, char * buffer, int mode, size_t size );


setbuf() 可以当作是调用setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZE);?
其中, mode是声明缓冲的类型,如下几个:


/* setvbuf example */
#include


int main ()
{
? FILE *pFile=fopen ("myfile.txt","w");
? setvbuf ( pFile , NULL , _IOFBF , 1024 );
? // File operations here
? fclose (pFile);
? return 0;
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HttpClient4 用法 由HttpClient3 .. 下一篇Effective Java - 延迟初始化

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: