перенаправление вывода паскаль - PullRequest
0 голосов
/ 26 декабря 2011

Это странный вопрос. У меня есть источник Паскаль, который интенсивно использует функцию GotoXY для генерации вывода, но теперь мне нужно перенаправить вывод из консоли в файл. Есть идеи?

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Наконец сделано.

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.
0 голосов
/ 26 декабря 2011

Я предполагаю, что вы говорите о функции Turbo Pascal, а не о функции с аналогичным именем, доступной для C / C ++. (Хотя функции очень похожи.)

К сожалению, у вас есть несколько вещей, которые работают против вас - версии экрана и файла Writeln отличаются, GotoXY - зарезервированное слово, и др. Я подозреваю, что вам лучше всего заменить вызовы ввода-вывода обычным вызовом функции, который внутренне направляет экран или файл на основе глобального флага. Или вы можете вставить отдельные операторы IF, чтобы выбрать, какую логику использовать везде, где происходит ввод / вывод.

...