2011-12-26 4 views
0

이것은 이상한 질문입니다. 나는 intesively 출력 생성을 위해 GotoXY 함수를 사용하는 파스칼 소스를 가지고 있지만 지금은 콘솔에서 파일로 출력을 리디렉션해야합니다. 어떤 아이디어?파스칼 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

+0

어, 어떻게 파일에 쓸 때 "포맷"합니까? 선형 "표현"에 제약이 있습니다. –

+0

알아,하지만 GotoXY는 콘솔 화면에서이 제한을 제거합니다. 아래의 내 솔루션을 참조하십시오. – yuyoyuppe