CppBuilder2006
جمعه 15 شهریور 1392, 11:37 صبح
در این برنامه من سعی کردم تابعی مثل GetCharAt برای کنسول لینوکس راهی پیدا کنم که کاراکتری که قبلا در سطر x و ستون y چاپ شده رو برگردونه. همه چیز درست کار میکنه مگه وقتی از SetCursorPosition استفاده کنیم:
#include <streambuf>
#include <iostream>
using namespace std;
#include <stdio.h>
string console_string;
struct Buf : public streambuf
{
streambuf* buf;
public:
int overflow(int c)
{
if (c != char_traits<char>::eof())
{
console_string.push_back(c);
}
return this -> buf -> sputc(c);
}
int sync()
{
return this -> buf -> pubsync();
}
Buf(): buf(cout.rdbuf())
{
cout.rdbuf(this);
}
~Buf()
{
cout.rdbuf(this -> buf);
}
} console_string_activator;
char GetCharAt(short x, short y)
{
if(x < 1)
x = 1;
if(y < 1)
y = 1;
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; j < x; j++)
{
if(i + j >= console_string.size() || console_string[i + j] == '\n')
return 0;
}
if(i + j >= console_string.size())
return 0;
return console_string[i + j - 1];
}
void SetCursorPosition(short x, short y)
{
printf("\e[%i;%if",x,y);
cout.flush();
}
int main()
{
cout << "aaaa";
SetCursorPosition(1,2);
cout<<"bbbb";
SetCursorPosition(10,1);
for(unsigned j = 0; j <= console_string.size(); j++)
{
printf("%c",console_string[j]);
}
cout<< "\n\n";
}
راهی برای حل این موضوع وجود دارد؟ البته بدون بستههایی مثل ncurses.
#include <streambuf>
#include <iostream>
using namespace std;
#include <stdio.h>
string console_string;
struct Buf : public streambuf
{
streambuf* buf;
public:
int overflow(int c)
{
if (c != char_traits<char>::eof())
{
console_string.push_back(c);
}
return this -> buf -> sputc(c);
}
int sync()
{
return this -> buf -> pubsync();
}
Buf(): buf(cout.rdbuf())
{
cout.rdbuf(this);
}
~Buf()
{
cout.rdbuf(this -> buf);
}
} console_string_activator;
char GetCharAt(short x, short y)
{
if(x < 1)
x = 1;
if(y < 1)
y = 1;
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; j < x; j++)
{
if(i + j >= console_string.size() || console_string[i + j] == '\n')
return 0;
}
if(i + j >= console_string.size())
return 0;
return console_string[i + j - 1];
}
void SetCursorPosition(short x, short y)
{
printf("\e[%i;%if",x,y);
cout.flush();
}
int main()
{
cout << "aaaa";
SetCursorPosition(1,2);
cout<<"bbbb";
SetCursorPosition(10,1);
for(unsigned j = 0; j <= console_string.size(); j++)
{
printf("%c",console_string[j]);
}
cout<< "\n\n";
}
راهی برای حل این موضوع وجود دارد؟ البته بدون بستههایی مثل ncurses.