2011-12-26 3 views
0

これは奇妙な質問です。私はintesively出力生成のために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は予約語です。私はあなたの最善の策は、内部的に画面またはグローバルフラグに基づいてファイルに指示する共通の関数呼び出しで入出力呼び出しを置き換えることだと思う。または、個別のIFステートメントを挿入して、I/Oがどこでも使用されるロジックを選択することもできます。

+0

はい、約tp func。フォーマットはGotoXYなしで失われます。代わりにこのhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms684969(v=vs.85).aspx関数を試してみてください。 – yuyoyuppe

+0

ファイルに書き込むときにどうやって "フォーマット"しますか?線形の「プレゼンテーション」には制約があります。 –

+0

私は知っていますが、GotoXYはコンソール画面でこの制限を解除します。以下の私のソリューションを参照してください – yuyoyuppe

関連する問題