pascal crt输出重定向

时间:2011-12-26 14:12:34

标签: io pascal

这是一个奇怪的问题。我有pascal源,它巧妙地使用GotoXY函数进行输出生成,但现在我需要将输出从控制台重定向到文件。有什么想法吗?

2 个答案:

答案 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发生的地方使用哪种逻辑。