用于将Ascii Art绘制到文件的控制台CLI应用程序(SetConsoleCursorPosition)

时间:2014-11-15 16:28:09

标签: console c++-cli streamwriter

我想写一个文本文件,这样每当用户点击一个键时,该文件就会在文件中特定的某个地方更新Ascii字符(不会附加在末尾),并且不会显示在文件中。屏幕。

虽然以下代码在输出到控制台窗口时有效,但我无法将其正确写入文件:

HANDLE hConsole = NULL;
void gotoxy ( int x, int y )
{
    COORD c = { x, y };
    SetConsoleCursorPosition ( hConsole, c );
}

int main(array<System::String ^> ^args)
{
    hConsole = GetStdHandle (STD_OUTPUT_HANDLE); 
    String^ fileName = "textfile.txt";
    StreamWriter^ sw = gcnew StreamWriter(fileName);
    gotoxy ( 50, 75 );
    sw->WriteLine("This line is not being written to the 50th column,and 75th row");
    //Console::WriteLine("This displays at the corrct position");
    sw->Close();    
    return 0;
 }

我看到了一种将控制台镜像到日志的方法,但是有没有办法在没有在控制台上显示的情况下写入文件? (Mirroring console output to a file

1 个答案:

答案 0 :(得分:0)

将控制台视为80x25字符阵列。当您执行SetConsoleCursorPosition时,您将移动到该数组中的某个位置,然后将文本写入该位置。现在,使用您手动管理的缓冲区执行相同的操作,然后将缓冲区写入磁盘。

这些方面的东西:

const int ROWS = 25;
const int COLUMNS = 80;
array<Char> buffer = gcnew array<Char>(COLUMNS * ROWS);
int activeLoc;

void SetBufferCursorPosition(int x, int y)
{
    activeLoc = y * COLUMNS + x;
}

void WriteBufferChar(Char c)
{
    buffer[activeLoc++] = c;
}

void WriteBufferString(String^ s)
{
    Array::Copy(buffer, activeLoc, s->ToCharArray(), 0, s->Length);
    activeLoc += s->Length;
}

void WriteToDisk()
{
    // Using StreamWriter without the '^', which gives us stack semantics, 
    // the C++/CLI rough equivalent of C#'s using statement.
    StreamWriter sw("textfile.txt");
    for(int i = 0; i < ROWS; i++)
    {
        sw->WriteLine(buffer, i * COLUMNS, COLUMNS);
    }
}
  • Char代替char因为我们想要.Net System::Char,而不是C ++非托管charChar为16位宽,char仅为8。
  • 我使用了大小为80 * 25而不是二维的一维数组,因为我认为你想要模拟在行末打印的长字符串将继续到下一行的行为。
  • 我没有处理缓冲区溢出。特别是,您可能希望在WriteBufferString中执行该操作。
    • 您可以复制不会超出的字符串部分。
    • 您可以手动换行到缓冲区的开头(即屏幕顶部)。
    • 您可以将数组中的所有字符向后移动80个字符(即将屏幕滚动一行)。