Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / C++ stderr/stdout 重定向到文件

通常,stderr和stdout被用来输出内容显示到屏幕,但是,有时候我们需要把这些信息写到指定的文件,方便随时查阅。最简单的实现方式就是,把 stderr/stdout 的输出重定向到文件。stderr/stdout 重定向到文件这里以stderr代码说明。#include <stdio.h>
#include <stdlib.h>int main( void )
{
 FILE *stream = freopen( "freopen.out", "w", stderr ); if( stream == NULL )
  fprintf( stdout, "error on freopen " );
 else
 {
  fprintf( stdout, "successfully reassigned " ); fflush( stdout );
  fprintf( stream, "This will go to the file "freopen.out" " );
  fprintf( stderr, "Also you can do it like this! " );
  fclose( stream );
 } // windwos下读取文件 freopen.out
 system( "type freopen.out" );
 getchar();
 return 0;
}执行结果如下,stderr与stdout的区别stdout(标准输出),输出方式是行缓冲。输出的字符会先存放在缓冲区,等按下回车键时才进行实际的I/O操作。stderr(标准出错),是不带缓冲的,这使得出错信息可以直接尽快地显示出来。关于缓冲的说明:
类型说明输出情况
满缓冲I/O操作只有在缓冲区被填满之后才会进行1.缓冲区满2.刷出数据 (fflush)3.关闭文件 (fclose)
行缓冲通常只有遇到换行符时,才会执行实际的I/O操作;但缓冲区满也会强制执行1.遇到换行符2.缓冲区满3.刷出数据 (fflush)4.关闭文件 (fclose)
无缓冲不缓存,直接进行I/O操作直接输出
然而就缓冲来说,stdout与stderr没有绝对的区别,因为缓冲类型可以设定。这里要借助 setvbuf() 或 setbuf() 函数。 #include <stdio.h> 
#include <stdlib.h> 
 
int main( void ) 

   
 char buf[512] = {0};
 setbuf(stderr, buf);
 fprintf(stderr, "It is error 1 ");
 printf("echo 1 ");
 fprintf(stderr, "It is error 2 ");
 printf("echo 2 ");
 fprintf(stderr, "It is error 3 ");  fflush(stderr);  getchar();
 return 0;
} 运行结果如下:这样,我们就可以定义缓冲区大小。缓冲区默认大小由 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是声明缓冲的类型,如下几个:
_IOFBF满缓冲
_IOLBF行缓冲
_IONBF无缓冲
size是缓冲区大小,单位字节。/* setvbuf example */
#include <stdio.h>int main ()
{
  FILE *pFile=fopen ("myfile.txt","w");
  setvbuf ( pFile , NULL , _IOFBF , 1024 );
  // File operations here
  fclose (pFile);
  return 0;
}本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-06/119123.htm