我正在尝试编写一个Delphi控制台应用程序,为其标准输入创建一个TStream,为其标准输出创建另一个TStream.
(它将由主机应用程序启动,其输入和输出重定向到管道,并将二进制数据传入/传出该主机应用程序,因此TStream将比ReadLn/WriteLn更适合于该任务.)
如何在标准输入或标准输出上打开TStream?
我正在努力在单元测试下获取一些遗留代码,有时感知现有程序行为的唯一方法是从控制台输出.
我在网上看到很多关于如何将stdout重定向到C++中的另一个文件的例子,但有没有办法可以将它重定向到内存中的流,这样我的测试就不必依赖磁盘了?
我希望将遗留代码发送到stdout的任何内容转换为std :: string,这样我就可以轻松地查找输出.
编辑
遗留代码是如此糟糕,以至于用户混合使用cout << ..和printf.这是我到目前为止:
void TestSuite::setUp(void)
{
oldStdoutBuf = std::cout.rdbuf();
std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
std::cout.rdbuf(oldStdoutBuf);
}
Run Code Online (Sandbox Code Playgroud)
问题是,这并没有用printf捕捉输出.我想要两件兼得的东西.有任何想法吗?
NB.我已经看到了multiprocessing.Process的日志输出 - 遗憾的是,它没有回答这个问题.
我正在通过多处理创建一个子进程(在Windows上).我希望将所有子进程的stdout和stderr输出重定向到日志文件,而不是出现在控制台上.我看到的唯一建议是子进程将sys.stdout设置为文件.但是,由于Windows上的stdout重定向行为,这不能有效地重定向所有stdout输出.
要说明此问题,请使用以下代码构建Windows DLL
#include <iostream>
extern "C"
{
__declspec(dllexport) void writeToStdOut()
{
std::cout << "Writing to STDOUT from test DLL" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
然后创建并运行如下所示的python脚本,它导入此DLL并调用该函数:
from ctypes import *
import sys
print
print "Writing to STDOUT from python, before redirect"
print
sys.stdout = open("stdout_redirect_log.txt", "w")
print "Writing to STDOUT from python, after redirect"
testdll = CDLL("Release/stdout_test.dll")
testdll.writeToStdOut()
Run Code Online (Sandbox Code Playgroud)
为了看到与我相同的行为,可能需要针对与Python使用的不同的C运行时构建DLL.在我的例子中,python是使用Visual Studio 2010构建的,但我的DLL是使用VS 2005构建的.
我看到的行为是控制台显示:
> stdout_test.py
Writing to STDOUT from python, before redirect
Writing to STDOUT …Run Code Online (Sandbox Code Playgroud) 行为printf()似乎取决于的位置stdout.
stdout发送到控制台,则printf()行缓冲并在打印换行符后刷新.stdout被重定向到文件,则除非fflush()被调用,否则不刷新缓冲区.printf()在stdout重定向到文件之前使用,则后续写入(对文件)是行缓冲的并在换行后刷新.何时进行stdout行缓冲,什么时候fflush()需要调用?
void RedirectStdout2File(const char* log_path) {
int fd = open(log_path, O_RDWR|O_APPEND|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
dup2(fd,STDOUT_FILENO);
if (fd != STDOUT_FILENO) close(fd);
}
int main_1(int argc, char* argv[]) {
/* Case 1: stdout is line-buffered when run from console */
printf("No redirect; printed immediately\n");
sleep(10);
}
int main_2a(int argc, char* argv[]) {
/* Case 2a: stdout is not line-buffered when …Run Code Online (Sandbox Code Playgroud) 要求是......
我们在RHEL-5服务器中部署了3个Web应用程序,我们使用tomcat 6.0.16部署了应用程序.我们想配置stdout,stderr,它们在应用程序特定的日志文件中进入tomcat/logs/catalina.out,如,
tomcat/logs/app1.log tomcat/logs/app2.log tomcat/logs/app3.log
我们正在使用log4j,但它只生成我们需要stdout per-app的日志记录详细信息,它将在tomcat/logs/catalina.out中出现
任何帮助赞赏......
如Python所示,sys.stdout.write()Ruby中的等价物是什么?
如何读取和写入标准输入,输出和错误流stdin,stdout以及stderr在Fortran中?我听说写stderr,例如,使用要write(5, fmt=...)与5单位的stderr,我知道写的方式stdout是使用write(*, fmt=...).
如何使用ifort编译器读取和写入标准输入和输出单元?
编译器版本:
英特尔(R)Fortran编译器,用于运行在英特尔(R)64,版本10.0 Build 20070426上的应用程序包ID:l_fc_p_10.0.023版权所有(C)1985-2007英特尔公司.版权所有
我正在创建一个处理预定义数据集的脚本,输出到文件.我想在一个数据(在我有权访问的每个集合中始终为"常规")不同时声明该值未处理(因为我不知道它如何影响数据)时弹出警告.我应该将此警告输出到stderr或stdout吗?
我有一个小的C程序来计算哈希值(哈希表).我希望代码看起来很干净,但有一些与它无关的东西让我烦恼.
我可以在大约0.2-0.3秒内轻松生成大约一百万个哈希值(以/ usr/bin/time为基准).但是,当我在forf循环中使用printf()时,程序会减慢到大约5秒钟.
我期待着有趣而详细的回复.谢谢.
PS:这是一个编译器构造工具集,所以不要害羞进入细节.虽然这与问题本身无关,但我只想指出细节让我感兴趣.
附录
我正在寻找更多解决方案和解释的程序方法.确实,管道工作起了作用,但我无法控制"用户"的作用.
当然,我现在正在进行测试,"普通用户"不会这样做.但这并没有改变一个简单的printf()减慢一个进程的事实,这是我试图找到一个最佳的编程解决方案的问题.
附录 - 惊人的结果
参考时间用于TTY内的普通printf()调用,大约需要4分钟20秒.
在/ dev/pts(例如Konsole)下进行测试可将输出速度提高到约5秒.
在我的测试代码中使用setbuffer()大小为16384时需要大约相同的时间,对于8192几乎相同:大约6秒.
setbuffer()在使用时显然没有效果:它需要相同的时间(在TTY上大约4分钟,在PTS上大约5秒).
令人惊讶的是,如果我在TTY1上开始测试然后切换到另一个TTY,它确实需要与PTS相同:大约5秒.
结论:内核做了一些与可访问性和用户友好性有关的事情.呵呵!
通常情况下,无论你是在活动时盯着TTY还是切换到另一个TTY,它都应该同样慢.
课程:运行输出密集型程序时,切换到另一个TTY!