我正在使用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,它也没有什么不同。
这是屏幕截图:
有什么想法为什么要这样做以及如何解决?
最佳答案
问题在于您的循环输出的数据超出了控制台的屏幕缓冲区可以容纳的数量。初始缓冲区可容纳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();