gpt4 book ai didi

c++ - 在程序执行期间从标准输出重定向到自定义流

转载 作者:行者123 更新时间:2023-11-27 23:36:15 25 4
gpt4 key购买 nike

我有一个函数可以将消息从标准输出重定向到日志文件。问题是,消息只在程序结束后写入日志文件。程序运行时是否可以写入日志文件?因此,在每个 std::cout 之后,都会向日志文件添加一个新行。我应该做出哪些改变?

struct Node{
char data[100];
struct Node* next;
};

class capturebuf : public std::stringbuf{
public:
capturebuf(){
head = NULL;
filename = "D:/checkouts/pointcloudbuilder/scene_plugin/log.txt";
log.open(filename);
}
protected:
struct Node* head;
std::string filename;
std::ofstream log;

virtual int sync(){
//ensure NUL termination
overflow(0);

struct Node* new_node = new Node();
strcpy(new_node->data, pbase());
new_node->next = head;
head = new_node;

log << head->data;

//clear buffer
str(std::string());
return __super::sync();
}
};
struct scoped_cout_streambuf_association{
std::streambuf* orig;
scoped_cout_streambuf_association( std::streambuf& buf )
: orig(std::cout.rdbuf()){
std::cout.rdbuf(&buf);
}
~scoped_cout_streambuf_association(){
std::cout.rdbuf(orig);
}
};

int main() {
capturebuf altout;
scoped_cout_streambuf_association redirect(altout);
return 0;
}

最佳答案

流是缓冲的,因此您需要使用 std::flush 显式刷新您的流.更多信息在此 question .

改变这个函数应该有帮助:

virtual int sync(){
//ensure NUL termination
overflow(0);

struct Node* new_node = new Node();
strcpy(new_node->data, pbase());
new_node->next = head;
head = new_node;

log << head->data << std::flush; // << add explicit flush

//clear buffer
str(std::string());
return __super::sync();
}

关于c++ - 在程序执行期间从标准输出重定向到自定义流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58994465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com