`
cwqcwk1
  • 浏览: 86820 次
文章分类
社区版块
存档分类
最新评论

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\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 <stdio.h>  
#include <stdlib.h>  
  
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 <stdio.h>

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


参考:http://blog.csdn.net/mycwq/article/details/46554805
分享到:
评论

相关推荐

    Windows管道(Pipe)重定向stdout,stderr,stdin

    有时我们需要重定向stdout,stderr,stdin。比如:将输出写入文件,又或者我们要将命令行程序输出结果显示到Windows对话框中。源码示范如何在Windows中实现,封装了几个简单易用的函数。

    c++函数stderr

    2. **不可重定向**:即使`stdout`被重定向到文件,`stderr`仍然会输出到原始的目标位置(通常是屏幕),这有助于开发者在调试过程中更清晰地看到错误信息。 3. **独立性**:`stderr`和`stdout`是独立的,这意味着...

    c/c++输出重定向的方法

    在C和C++编程中,输出重定向是一种高级技术,允许程序员将程序的输出从标准输出设备(通常是显示器)重定向到文件或其他流。这在需要记录程序运行日志、测试输出或者与其他程序进行交互时非常有用。以下是两种在C和...

    详解python的几种标准输出重定向方式

    在Python编程中,标准输出重定向是一个非常实用的技巧,特别是在需要将程序的输出保存到文件、合并输出或者处理错误信息时。这篇文章主要基于Python 2.7版本,讲解了如何进行标准输出重定向,同时也适用于标准错误的...

    redir_demo.zip_Console 重定向_DEMO_dos重定向_输出重定向_重定向

    这个程序可能设计用来展示如何利用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的重定向功能。通过重定向,我们可以将程序的输出发送到文件,或者从文件读取输入,而不是从键盘。例如,可以使用`&gt;`...

    重定向程序设计

    5. **组合重定向**:使用 `&&gt;` 或 `&gt;&` 符号可以同时重定向标准输出和错误到同一个文件。 在编程语言中,如C/C++,我们可以使用相应的库函数来实现重定向,如`freopen()`函数。这个函数可以改变一个流的关联文件...

    C++Fstream文件流与freopen重定向操作教程

    例如,`freopen("in.txt", "r", stdin)`将标准输入重定向到`in.txt`文件,而`freopen("out.txt", "w", stdout)`则将标准输出重定向到`out.txt`。 使用`freopen()`时,注意关闭不再使用的流以释放资源,如`fclose...

    匿名管道实现控制台重定向

    首先,父进程创建一个匿名管道,并设置好读写端,然后创建子进程,将管道的写端作为标准输出(stdout)或标准错误(stderr)。子进程运行`PING`命令时,其输出会被重定向到管道的写端。同时,父进程可以通过管道的读...

    Tcl输入输出重定向Demo

    在操作系统层面,程序的输入和输出通常通过标准输入(stdin)、标准输出(stdout)和标准错误(stderr)三个流来管理。重定向允许我们将这些流指向不同的位置,比如文件、网络连接甚至是其他进程的输入输出。在Tcl中...

    控制台程序输出重定向

    2. **捕获标准流**:在`CWinApp`的`InitInstance`方法中,获取`stdin`, `stdout` 和 `stderr` 的原始文件描述符,然后使用`freopen`函数重定向到自定义的文件流。 ```cpp FILE* old_stdin = freopen("NUL:", "r",...

    stdout.txt

    从给定的文件信息来看,主要涉及的知识点集中在C++编程中的文件重定向、标准输入输出流(stdin, stdout, stderr)的管理以及Windows环境下的多线程编程。以下是对这些知识点的详细解析: ### 文件重定向与标准流...

    vs2008,控制台程序输入输出重定向

    在编程领域,尤其是在C++环境中,控制台程序的输入输出重定向是一项重要的技术,它允许我们改变默认的输入(stdin)和输出(stdout)流,将它们指向不同的源或目标,比如文件、内存缓冲区甚至是网络连接。...

    第7章 文件和结构体(C++版).ppt

    `stream`参数通常是标准流文件,如`stdin`(标准输入)、`stdout`(标准输出)和`stderr`(标准错误)。通过`freopen()`,我们可以将这些标准流重定向到其他文件,例如: ```cpp freopen("slyar.in", "r", stdin); ...

    MFC中使用控制台输入输出

    在Microsoft Foundation Classes (MFC)库中,虽然主要设计用于创建Windows GUI应用程序,但有时我们需要在MFC程序中实现控制台输入...这个过程涉及到创建控制台窗口、重定向输入输出流以及在MFC框架中使用标准C++流。

    基于对话框例子程序,MFC调用控制台,利用cout、printf输出信息

    然后,我们可以将标准输入、输出和错误流重定向到这个新的控制台,以便使用`cout`和`printf`进行输出。 `cout`是C++标准库中的一个对象,用于标准输出流操作,主要用于输出文本到控制台。它依赖于`std::ostream`类...

    对于管道划分,环境变量,输入输出重定向

    重定向(Redirection)则是改变程序默认的输入和输出流,允许我们将数据从文件或其他源导入,或者将程序的输出写入到文件或别的地方。而环境变量(Environment Variables)则是存储系统或用户信息的变量,它们对程序...

    rec.rar_rec_重定向

    例如,Linux或Windows命令行中的"&gt;"符号用于将输出重定向到文件,而"&&gt;"则同时重定向标准输出和标准错误到同一个文件。 在本例中,“rec”可能是一个特定的命令或者程序,它在控制台下运行并产生一些输出。为了将...

    VC实现远程CMD的功能

    4. **输入/输出重定向**:为了实现命令的输入和输出,我们需要重定向标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)。在VC中,可以使用CreatePipe函数创建管道,然后通过SetHandleInformation和...

Global site tag (gtag.js) - Google Analytics