700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > c++输出重定向 linux C++ stderr/stdout 重定向到文件

c++输出重定向 linux C++ stderr/stdout 重定向到文件

时间:2023-10-30 07:43:55

相关推荐

c++输出重定向 linux C++ 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;

}

执行结果如下,

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

#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;

}

运行结果如下:

这样,我们就可以定义缓冲区大小。缓冲区默认大小由 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

int main ()

{

FILE *pFile=fopen ("myfile.txt","w");

setvbuf ( pFile , NULL , _IOFBF , 1024 );

// File operations here

fclose (pFile);

return 0;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。