这是一个奇怪的问题。我有pascal源,它巧妙地使用GotoXY函数进行输出生成,但现在我需要将输出从控制台重定向到文件。有什么想法吗?
答案 0 :(得分:1)
终于完成了。
uses
Windows;
type
TAttachConsole = function (dwProcessId: DWORD): LongBOOL stdcall;
var
AttachConsole: TAttachConsole;
mProcessID, Hcwnd: Cardinal;
procedure Attach;
begin
@AttachConsole := GetProcAddress(GetModuleHandle('kernel32.dll'), 'AttachConsole');
GetWindowThreadProcessId(FindWindow(nil,'C:\WINDOWS\system32\cmd.exe'),@mProcessID);
AttachConsole(mProcessID);
end;
function get(x, y: byte) : string;
const
SMB = 1;
var
chRead: Cardinal;
BufInfo: _CONSOLE_SCREEN_BUFFER_INFO;
lpCh : PChar;
Coord: _COORD;
begin
Hcwnd:=GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo (Hcwnd, BufInfo);
GetMem(lpCh,SMB);
Coord.X:=x;
Coord.Y:=y;
lpch := '';
ReadConsoleOutputCharacter(Hcwnd,lpCh,SMB,Coord,chRead);
get:=string(lpCh^);
end;
var x, y : integer;
buf : array[0..24] of string;
begin
for y := 0 to 24 do
begin
for x := 0 to 79 do
buf[y] := buf[y] + get(x,y);
end;
for y := 0 to 24 do
writeln(buf[y]);
end.
答案 1 :(得分:0)
我假设您正在谈论Turbo Pascal函数,而不是可用于C / C ++的类似命名函数。 (虽然功能非常相似。)
不幸的是,您有几件事情对您不利 - Writeln
的屏幕和文件版本不同,GotoXY
是一个保留词,等等。我怀疑你最好的办法是用一个内部指向屏幕或文件的公共函数调用来替换I / O调用,这些调用是基于全局标志的。或者您可以插入单独的IF
语句来选择在I / O发生的地方使用哪种逻辑。