【发布时间】:2026-01-12 13:55:01
【问题描述】:
使用 glibc 的 stdio,我可以将 memstream 交换为 stdout,从而捕获一段编译后输出到 stdout 的代码的输出:
#include <stdio.h>
void swapfiles(FILE* f0, FILE* f1){ FILE tmp; tmp = *f0; *f0 = *f1; *f1 = tmp; }
void hw_c(){ puts("hello c world"); }
int c_capt(){
FILE* my_memstream;
char* buf = NULL;
size_t bufsiz = 0;
if( (my_memstream = open_memstream(&buf, &bufsiz)) == NULL) return 1;
FILE * oldstdout = stdout;
swapfiles(stdout, my_memstream);
hw_c();
swapfiles(stdout, my_memstream);
fclose(my_memstream);
printf("Captured: %s\n", buf);
}
我很好奇iostreams 是否也可以这样做。
我天真的尝试不会编译:
#include <iostream>
#include <string>
#include <sstream>
void hw_cc(){ std::cout<<"hello c++ world\n"; }
int cc_capt(){
using namespace std;
stringstream ss;
string capt;
//std::swap(ss,cout); //<- the compiler doesn't like this
hw_cc();
//std::swap(ss,cout);
cout<<"Captured: "<<capt<<'\n';
}
int main(int argc, char** argv){
c_capt();
puts("---------------------------------");
cc_capt();
return 0;
}
【问题讨论】:
-
不要垃圾标签! C 是一种不同的语言!
-
std::cout.rdbuf(ss.rdbuf()),但实际上你会定义int cc_capt(std::ostream&)并传入流。 -
@user657267,如果您无法访问所有功能(例如
cc_hw()),那么捕获std::cout是一个不错的方法。我在一些单元测试中这样做,其中某些功能只是在控制台中打印消息。