我有一个拥有数千个元素的数组。我有一个for循环来打印出来,但一次只有200个。
要继续下一个200,用户将获得文本"按Enter继续"我使用cin.get();暂停在那里。
打印得到很多"按Enter继续"这里和那里所以我想用回车来覆盖"按Enter继续"与一些" ======"。
不幸的是,当我使用cin.get()时,我的程序没有覆盖它;第一
有解决方法吗?
string pressEnter = "\nPress Enter to continue . . .";
string lineBorders = "========================================================================================================";
for (int *ia = arrayen, i = 1; ia < arrayenEnd; ia++, i++)
{
cout << setw(10) << *ia;
if (i > 9 && i % 10 == 0) {
cout << endl;
}
if (i > 199 && i < size && i % 200 == 0) {
cout << pressEnter << '\r' << flush;
cout.flush();
cin.get();
cout << lineBorders << endl;
}
}
答案 0 :(得分:0)
首先,您不应该使用std::cin.get()
。如果键入一些字符然后按Enter键,则每个字符将导致一次调用std::cin.get()
。您可以使用std::getline(std::cin, string)
来代替整行。
其次,打印回车的那一刻,光标已经在新行上,因为您按下了Enter键。此外,回车符通常不会清除该行,而只会移动光标。您可以使用CSI转义序列[1]来实现您的目标:首先向上移动一行\e[A
,然后清除整行\e[2K
。
总而言之,你会得到这样的东西:
#include <iostream>
#include <string>
int main() {
while (true) {
std::cout << "a\nb\nc\n";
std::cout << "Press [Enter] to continue.";
std::string line;
std::getline(std::cin, line);
std::cout << "\e[A\e[2K";
}
}
在Windows上,您必须首先使用SetConsoleMode()
[2]启用转义序列的解析。从文档来看,它应该看起来像这样(未经测试,我没有窗口):
#include <iostream>
#include <string>
#include <windows.h>
int main() {
// Get a handle to standard input.
HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD old_mode;
bool escape_codes = false;
// Get the old mode and enable escape code processing if everything works.
if (handle != INVALID_HANDLE_VALUE) {
if (GetConsoleMode(handle, &old_mode)) {
DWORD new_mode = old_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
escape_codes = SetConsoleMode(handle, new_mode);
}
}
while (true) {
// Same as other platforms.
std::cout << "a\nb\nc\n";
std::cout << "Press [Enter] to continue.";
std::string line;
std::getline(std::cin, line);
// Only print escape codes if we managed to enable them.
// Should result in a graceful fallback.
if (escape_codes) {
std::cout << "\e[A\e[2K";
}
}
// Restore the old mode.
if (escape_codes) {
SetConsoleMode(handle, old_mode);
}
}