stdout( 标准输出流)和 stderr( 标准输入流) 重定向问题
我想把提示信息和错误信息列表都写入到同一个文件里,
1 /* 2 ** 设置流, 使输出与错误流都指向指定的文件 3 */ 4 if( (output1 = freopen( PATH, "a", stdout ) ) == NULL ) 5 exit( EXIT_FAILURE ); 6 7 if( (output2 = freopen( PATH, "a", stderr ) ) == NULL ) 8 exit( EXIT_FAILURE );
开始, 我这么写
fputs( "错误列表:\n", output1 ); for( i = 1; i <= 42; i ++ ){ errno = i; perror( "ERROR" ); }
结果, 文件中的内容是 错误信息列表在前面, 提示信息在结尾处。
我百度了下, 发现stdout流的缓冲方式是完全缓冲,stderr是不缓冲, 完全缓冲是指等缓冲区满了后写入, 所以我用setvbuf改变了stdout的缓冲方式( 还要声明一个足够大的数组buffer), 改成不缓冲, 即在这段代码前添加一句
setvbuf( output1, buffer, _IONBF, BUFSIZ );
这样,问题就解决了。
还有一种办法, 就是在fputs后加一句 fflush( output1 ); 意思是立即写入缓冲区的内容。
最后, 贴出结果, 嘻嘻