我正在使用Windows。我设法将问题简化为此。
#include<iostream>
#include<conio.h>
#include<windows.h>
using namespace std;
int main()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),23);
for (int i=0;i<400;++i)
{
cout<<i<<'\n';
}
cout.flush();
getch();
return 0;
}
它应该只为文本和整行着色,但在第300行之后,整行被着色而不仅仅是文本。使用'\ n'和endl之间似乎没有任何区别。此外,无论文本是什么,或者我多次更改颜色,只是行数。我也尝试过使用printf,它也没有什么区别。
这是截图:
为什么会这样做以及我如何解决它的任何想法?
答案 0 :(得分:1)
问题是你的循环输出的数据多于控制台的屏幕缓冲区所能容纳的数据。初始缓冲区可容纳300行。当您的循环输出超过该初始缓冲区的末尾时,旧内容将被丢弃,显然新内容现在已经在丢弃开始之前继承了最后一个输出的特征。未写入的缓冲单元的颜色最初是黑色的,但一旦缓冲区开始滚动就会变成蓝色。
您可以使用GetConsoleScreenBufferInfo()
检索初始缓冲区大小,然后使用SetConsoleScreenBufferSize()
增加缓冲区中的行数。如果您将行数设置为401+,则不会再看到蓝色填充整行(假设您的应用程序开始运行时屏幕上没有显示任何内容)。
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO info = {0};
GetConsoleScreenBufferInfo(hConsole, &info);
info.dwSize.Y = 401;
SetConsoleScreenBufferSize(hConsole, info.dwSize);
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_BLUE);
for (int i=0;i<400;++i)
{
cout<<i<<'\n';
}
cout.flush();