我想写一个文本文件,这样每当用户点击一个键时,该文件就会在文件中特定的某个地方更新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)
答案 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 ++非托管char
。 Char
为16位宽,char
仅为8。