通常,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;

}

c++输出重定向 linux,C++ stderr/stdout 重定向到文件相关推荐

  1. linux dns重定向,linux网关配置DNS重定向

    1.网络拓扑: 需求:内网所有去往公网DNS流量,都转发到内网的一台DNS服务器. 源需求贴:http://bbs.51cto.com/thread-939762-1.html ----用linux测 ...

  2. Linux文件解hgc,Linux shell I/O重定向详解

    I/O重定向详解及应用实例 1. 基本概念(这是理解后面的知识的前提,请务必理解) a. I/O重定向通常与 FD有关,shell的FD通常为10个,即 0-9: b. 常用FD有3个,为0(stdi ...

  3. Aspose.Cells使用教程:使用 .NET 在 Linux 上创建或编辑 Excel 文件

    如今自动化解决方案的出现使得电子表格自动化在各个行业中都很流行.电子表格文档是从 Web 或桌面解决方案中以编程方式创建和操作的.因此,本文介绍了如何使用 .NET 在 Linux 平台上创建 Exc ...

  4. linux重定向文件容加时间,linux – 如何在Bash中将stdout重定向到文件时添加时间戳?...

    我有一个程序(服务器),我正在寻找一种方法(脚本),将所有的stdout重定向(或更好地复制)到文件并为每个条目添加时间戳. 我做了一些研究,我能得到的最远的是得益于How to add timest ...

  5. WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)

    WorkerMan中work.php中 resetStd 方法中代码如下 public static function resetStd(){if (!static::$daemonize || st ...

  6. 输出重定向Linux命令,Linux Shell重定向(输入输出重定向)精讲

    Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向:从字面上理解,输入输出重定向就是「改变输入与输出的方向」的意思. 那么,什么是输入输出方向呢?标准的输入输出方向又是什么呢? ...

  7. linux stdout重定向

    标准输出(stdout)指的就是在命令行里,每次你输入指令后,终端上打印出来的那些话,那些反馈.标准错误(stderr)跟标准输出差不多,只不过是程序出错时反馈的内容.标准输入(stdin)就是程序指 ...

  8. 输出重定向Linux命令,Linux命令常用之输出重定向

    1.输出重定向的两种方式: >     覆盖原文件内容 >>  追加写,不覆盖原文件内容 2.两种重定向 错误命令重定向  2>    或    2>>       ...

  9. Linux中的数据流重定向

    本文目录 数据流重定向 本文目录(仅做浏览用,简书中的MarkDown暂时不支持页面内跳转) 数据流重定向 在之前的操作中,常会看到>或>>操作,它们分别是将标准输出导入到一个文件或 ...

最新文章

  1. 植树月收尾:合种油松/华山松/云杉/胡杨
  2. Android EditText禁止复制粘贴
  3. Citrix XenApp 下载及一年 developer license 获取
  4. rsyslogd 重启_ubuntu12.04 syslog记录正常与非正常关机重启
  5. 四针手表指的是什么_1000~1500元的男士手表推荐
  6. 本地添加Maven管理
  7. [转] @JoinColumn 详解 (javax.persistence.JoinColumn)
  8. java 日程日历_java编程:我要做一个提醒日程的软件,不是要用到日历和时钟么,这要不要自己编,还是可以直接同步电脑上...
  9. 如何实现验证码输入正确与否的判断?
  10. iOS 调用TouchID 身份验证
  11. JavaScript前端判断文件是否存在(案例详解)
  12. html网页的框架标记分别有,新手入门前端,应该知道HTML框架排版标记标签大全...
  13. Linux的基础存储管理
  14. 【C语言进阶】③探究浮点数在内存中的存储方式
  15. Dynamics 365 on-premises9.0版本开放下载,附上8.2升级9.0过程
  16. 读书百客:《题竹林寺》简析
  17. c#对话框,文件打开对话框,
  18. 【国产化系列】国产银河麒麟Kylin V10操作系统介绍
  19. 最新GLove词向量预训练文件国内服务器下载
  20. [附源码]Python计算机毕业设计办公用品管理系统

热门文章

  1. Vue3 --- axios 简单封装APi
  2. 苹果手机数据线充不了电_手机充电器充不了电?其实4招就能解决
  3. qt编译实现简单的文本编译器有粘贴复制_qmake 时复制文件(自动在编译前做一些操作,且写在.pro文件里)...
  4. C语言 typedef - C语言零基础入门教程
  5. Python zip函数 - Python零基础入门教程
  6. BugkuCTF-Crypto题affine
  7. udp计算机dll,Udp_SocketBll.dll
  8. Linux java 生效不了,linux jdk 不生效怎么办
  9. linux路由信息预览为空,route - 显示并设置Linux中静态路由表
  10. java applet 访问文件_使用JavaApplet访问数据库