【问题标题】:Monitoring standard output buffer and redirect to a string C++监视标准输出缓冲区并重定向到字符串 C++
【发布时间】:2016-12-23 11:56:21
【问题描述】:

我有多个正在打印的 .cpp 文件,我想将其重定向到一个字符串。我的项目的结构是:一个主文件,它从另一个文件和另一个文件调用函数。如果我有一个 .cpp 文件,使用 stringstream 很容易,但如果有多个文件,我该如何解决?

Main.cpp:

#include "Second.h"

int main() {
    std::string buffer = "First line";
    printOut(buffer);
    std::cout << "Hello world" << std::endl;
}

第二个.h:

#include <string>

void printOut(std::string buffer);

第二个.cpp

#include "Second.h"

void printOut(std::string buffer) {
    std::cout << buffer << std::endl;
}

在这种情况下,字符串应该如下所示:

redirectedString = First line\nHello World\n

【问题讨论】:

  • 请添加“它不起作用”的原因。
  • 无论你想做什么,这都是完全错误的做法。您要解决的真正问题是什么?不,不是您在这里问的问题,而是您认为这是解决方案的真正问题。
  • 真正的问题是我不知道如何检查输出缓冲区中是否有东西以及如何从那里抓取它。
  • @J.Devero 你为什么需要这样做?记录?
  • 您自己的程序/进程的输出还是其他的?如果它是不同的,您无法更改尝试在运行时将输出重定向到文件?

标签: c++ stdout io-redirection


【解决方案1】:

可以使用合适的流缓冲区截取标准流的输出。例如:

void do_something_with(std::string const& s) {
    // ...
 }

struct basicbuf: std::streambuf {
    std::string buf;
    int_type overflow(int_type c) {
        if (c != traits_type::eof()) {
             this->buf.push_back(c);
        }
        return traits_type::not_eof(c);
    }
    int sync() {
         do_something_with(buf);
         buf.clear();
         return 0;
    }
};

int main() {
     basicbuf buf;
     std::streambuf* orig = std::cout.rdbuf(&buf);

     std::cout << "hello, world\n" << std::flush;
     std::cout.rdbuf(orig);
}

当使用多个线程时,您可能希望使用线程本地缓冲区来避免数据争用。被调用的函数会主动将缓冲区转移到需要的地方。

【讨论】:

  • 非常感谢。但它仅在您有一个 .cpp 文件时才有效。如果您有多个正在打印的 .cpp 文件怎么办?
  • @J.Devero 为什么你认为它只适用于一个 .cpp 文件?
  • 我试过了,只包含main.cpp中打印出来的内容
  • @J.Devero:这似乎不太可能。在调用另一个函数之前是否重定向了输出?未重定向时是否打印输出?如果另一个函数位于另一个共享对象 (.dll) 中,则重定向不起作用:每个共享对象可能有自己的标准 C++ 库。
  • 是的,我在调用函数之前重定向,并且在未重定向时打印输出。我认为这是问题所在,因为函数的声明位于 .dll 中。有什么解决办法吗?
猜你喜欢
  • 1970-01-01
  • 2014-02-18
  • 2010-11-16
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多