gpt4 book ai didi

c++ - 在 linux 控制台应用程序中获取给定位置的字符

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:21 27 4
gpt4 key购买 nike

在下面的程序中,我试图改进函数 GetCharAt 返回给定位置的字符和 SetCursorPosition 将终端光标移动到给定位置,在 linux C++ 控制台应用程序中。但是每个功能都会相互干扰。例如在 main 中,注释掉 SetCursorPosition 将恢复 GetCharAt 的正常功能。

#include <streambuf>
#include <iostream>
using namespace std;
#include <stdio.h>

string console_string;

struct capturebuf : public streambuf
{
streambuf* d_sbuf;

public:
capturebuf():
d_sbuf(cout.rdbuf())

{
cout.rdbuf(this);
}
~capturebuf()
{
cout.rdbuf(this -> d_sbuf);
}
int overflow(int c)
{
if (c != char_traits<char>::eof())
{
console_string.push_back(c);
}
return this -> d_sbuf->sputc(c);
}
int sync()
{
return this -> d_sbuf->pubsync();
}
} console_string_activator;

char GetCharAt(short x, short y)
{
if(x < 1)
x = 1;
if(y < 1)
y = 1;

bool falg = false;
unsigned i;
for(i = 0; 1 < y; i++)
{
if(i >= console_string.size())
return 0;
if(console_string[i] == '\n')
y--;
}
unsigned j;
for(j = 0; console_string[i + j] != '\n' && j < x; j++)
{
if(i + j >= console_string.size())
return 0;
}
if(i + j - 1 < console_string.size())
return console_string[i + j - 1];
return 0;
}

void SetCursorPosition(short x,short y)
{
char buffer1[33] = {0};
char buffer2[33] = {0};

string a = "\e[";

sprintf(buffer1,"%i",y);
sprintf(buffer2,"%i",x);

string xx = buffer1;
string yy = buffer2;

cout<< a + xx + ";" + yy + "f";
cout.flush();
}

void SetCursorPosition2(short x, short y)
{
printf("\e[%i;%if",x,y);
cout.flush();
}

int main()
{
SetCursorPosition(1,1); // comment out this line for normal functionality
cout << "hello" "\n";

for(unsigned j = 1; j <= 5; j++)
{
printf("%c",GetCharAt(j,1));
}
cout<< "\n";
}

如何更改 SetCursorPosition 使其不干扰 GetCharAt

最佳答案

您在这里尝试的方法非常脆弱,不可能实现。 GetCharAt() 假设输出的每个字符都是可打印的,并且没有任何东西移动光标。您的 SetCursorPosition() 正是这样做的,因此跟踪到目前为止已输出的内容的想法根本行不通。

另外,其他进程可能会在您的程序中间向控制台输出内容,例如来自 root 的 wall 消息。你想要的是“ncurses”,http://en.wikipedia.org/wiki/Ncurses ,一个可能已经存在于您的系统上的库。它已经以独立于终端的方式解决了这些问题,并提供了一大套功能,用于在屏幕上移动、滚动、绘图、颜色等,所有这些都在终端中进行。

关于c++ - 在 linux 控制台应用程序中获取给定位置的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18644913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com