将 cout 的最后一行发送到 window
Send the last line of cout to a window
在我的应用程序中,我有一个控制台(使用 std::out)和一个 window(具有显示一些文本的功能)。我正在寻找的是一种在我的 window 中显示最后一行 cout 的方法。我读过一些关于制作自定义 streambuf class 或只是重载 << 运算符的结构的文章。我不能重载 << 运算符,因为如果这样做,我将无法使用 endl 之类的东西。
另一个 post here 建议定义我自己的 streambuf,但我不知道这是否是解决我的问题的好方法。也许有人可以就如何实现此功能给我建议。
您 可以 超载 <<
为此目的。要使其与流操纵器一起使用,您可以使用内部 std::stringstream
:
class out
{
std::ostringstream ss;
std::string display_str;
public:
template <typename T> out &operator<<(T &&obj)
{
std::cout << obj;
ss.str("");
ss << obj;
std::string tmp = ss.str();
if (tmp.size() == 0)
return *this;
const char *ptr = &tmp[0], *start = ptr;
while (*ptr)
{
if (*ptr == '\n')
start = ptr+1;
ptr++;
}
if (start != ptr)
display_str = start;
else
display_str += start;
update_display_string(display_str); // Replace this with your update function.
return *this;
}
};
在我的应用程序中,我有一个控制台(使用 std::out)和一个 window(具有显示一些文本的功能)。我正在寻找的是一种在我的 window 中显示最后一行 cout 的方法。我读过一些关于制作自定义 streambuf class 或只是重载 << 运算符的结构的文章。我不能重载 << 运算符,因为如果这样做,我将无法使用 endl 之类的东西。
另一个 post here 建议定义我自己的 streambuf,但我不知道这是否是解决我的问题的好方法。也许有人可以就如何实现此功能给我建议。
您 可以 超载 <<
为此目的。要使其与流操纵器一起使用,您可以使用内部 std::stringstream
:
class out
{
std::ostringstream ss;
std::string display_str;
public:
template <typename T> out &operator<<(T &&obj)
{
std::cout << obj;
ss.str("");
ss << obj;
std::string tmp = ss.str();
if (tmp.size() == 0)
return *this;
const char *ptr = &tmp[0], *start = ptr;
while (*ptr)
{
if (*ptr == '\n')
start = ptr+1;
ptr++;
}
if (start != ptr)
display_str = start;
else
display_str += start;
update_display_string(display_str); // Replace this with your update function.
return *this;
}
};