2011-12-26 110 views
0

這是一個奇怪的問題。我有一個pascal源代碼,它使用GotoXY函數來生成輸出,但現在我需要將輸出從控制檯重定向到一個文件。有任何想法嗎?pascal crt輸出重定向

回答

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. 
0

我假設你在談論Turbo Pascal函數,而不是C/C++提供的類似命名函數。 (雖然功能非常相似。)

不幸的是,你有幾件事情對你的工作 - 的Writeln屏幕和文件版本不同,GotoXY是一個保留字,等。我懷疑你最好的選擇是用一個內部指向基於全局標誌的屏幕或文件的通用函數調用來替換I ​​/ O調用。或者你可以插入單個的IF語句來選擇在任何發生I/O的地方使用哪種邏輯。

+0

是的,關於tp func。但是沒有GotoXY,格式化將會丟失。可以試試這個http://msdn.microsoft.com/en-us/library/windows/desktop/ms684969(v=vs.85).aspx函數。 – yuyoyuppe 2011-12-26 14:53:07

+0

呃,在寫入文件時如何「格式化」?你有點受限於線性「演示」。 – 2011-12-26 18:50:20

+0

我知道,但GotoXY在控制檯屏幕上刪除了這個限制。請參閱下面的解決方案 – yuyoyuppe 2011-12-27 18:33:39