std::cout每次使用时都会重新打印控制台中当前的所有内容

std::cout re-printing everything currently in the console, each time it is used

本文关键字:控制台 打印 cout 新打印 std      更新时间:2023-10-16

由于某种原因,每次我使用std::cout时,控制台的整个内容(有点难以解释)都会重新打印,除非我是<< endl;。为了提供一些上下文,我使用glfw来支持我的Window类,它具有更高级别的std::函数回调。我的编译器是MinGW 3.21,使用的是C++11 MinGW 3.21。发生了什么事?

void Window::setTextCallback(std::function<void(char text)> callback) {
    textCallback = callback;
    auto onText = [](GLFWwindow* window, unsigned int text, int mods) {
        Window* win = reinterpret_cast<Window*>(glfwGetWindowUserPointer(window));
        win->textCallback(static_cast<char>(text));
    };
    glfwSetCharModsCallback(window, onText);
}

然后在main.cpp。。。

Window w;
w.setTextCallback([](char text){
    cout << text;
}

当窗口打开时,假设我键入"asdf"。输出为"aaasdasdf"。在慢动作中,它是:"a","aas","aasasd",aasasdasdf"。

但是,如果我将main.cpp更改为:

Window w;
w.setTextCallback([](char text){
    cout << text << endl;
}

输出为:
"a
s
d
f"
正如预期的那样。

没有其他线程使用cout,我知道这一点,因为我没有任何其他线程。这种行为在其他地方不会发生。

cout是一个缓冲区。因此,每次<<到它时,你只是在添加文本,它就会保持不变。endl是刷新缓冲区的一种方法。如果你只想打印你推入其中的最后一段文本,你需要从空开始。试试这篇文章,然后我相信你的谷歌搜索可以解决你可能对此有任何问题。