Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie die Error-Ausgabe erstellen im Konsolenprogramm?? (https://www.delphipraxis.net/34386-wie-die-error-ausgabe-erstellen-im-konsolenprogramm.html)

Kedariodakon 22. Nov 2004 12:53


Wie die Error-Ausgabe erstellen im Konsolenprogramm??
 
Ok folgendes:
Ich möchte in meinem Konsolen Programm eine Error-Ausgabe haben!
Ok mal an einem Beispiel erklären was das ist:

Tipt mal in der CMD folgendes ein: Dir C:\haumichtod 1>AusgabeNormal.txt 2>AusgabeError.txt + Enter

Nun werden die Ausgaben in die Textdatein umgeleitet, "AusgabeNormal.txt" ist die normale "AusgabeError.txt" die Error...

Da es bei euch diese haumichtod Datei nicht geben sollte, habt ihr in beiden Datein was drinn...

Wie bekomm ich das hin, das ich in meinem Konsolen-Programm was in die Error-Ebene reinschreiben kann? :gruebel:

Mit Delphi-Referenz durchsuchenWriteln() schreib ich nur in die normale...



Bye

Motzi 22. Nov 2004 13:11

Re: Wie die Error-Ausgabe erstellen im Konsolenprogramm??
 
IMHO sollte das so gehn...
Delphi-Quellcode:
WriteLn(ErrOutput, 'Test');

Dax 22. Nov 2004 13:12

Re: Wie die Error-Ausgabe erstellen im Konsolenprogramm??
 
Write{Ln} nimmt als ersten Parameter auch eine Datei, die du mit Delphi-Referenz durchsuchenAssignFile öffnen kannst. Du öffnest also beide Dateien und schreibst entsprechend mit WriteLn(Normal, 'etwas') und WriteLn(Error, 'Fehler').

Marcel Gascoyne 22. Nov 2004 13:27

Re: Wie die Error-Ausgabe erstellen im Konsolenprogramm??
 
Du musst das Handle von stderr ermitteln und Deiner Ausgabedatei entsprechend zuweisen:

Delphi-Quellcode:
program test_stderr;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

var
  stderr: TextFile;
  handle: Integer;

begin
  AssignFile(stderr,'CONOUT$');
  ReWrite(stderr);
  handle := TTextRec(stderr).Handle;
  TTextRec(stderr).Handle := Integer(GetStdHandle(STD_ERROR_HANDLE));
  WriteLn('Dies geht nach stdout');
  WriteLn(stderr,'Dies geht nach stderr');
  TTextRec(stderr).Handle := handle;
  CloseFile(stderr);
end.
Gruß,
Marcel

Kedariodakon 22. Nov 2004 14:09

Re: Wie die Error-Ausgabe erstellen im Konsolenprogramm??
 
Zitat:

Zitat von Motzi
IMHO sollte das so gehn...
Delphi-Quellcode:
WriteLn(ErrOutput, 'Test');

Das Funzt :thumb:


Zitat:

Zitat von Marcel Gascoyne
Du musst das Handle von stderr ermitteln und Deiner Ausgabedatei entsprechend zuweisen:

Delphi-Quellcode:
program test_stderr;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

var
  stderr: TextFile;
  handle: Integer;

begin
  AssignFile(stderr,'CONOUT$');
  ReWrite(stderr);
  handle := TTextRec(stderr).Handle;
  TTextRec(stderr).Handle := Integer(GetStdHandle(STD_ERROR_HANDLE));
  WriteLn('Dies geht nach stdout');
  WriteLn(stderr,'Dies geht nach stderr');
  TTextRec(stderr).Handle := handle;
  CloseFile(stderr);
end.
Gruß,
Marcel

Das sieht komplizierter aus :gruebel:
Aber ich werd es mir mal anschaun...

Gibt es den Situationen, wo Motzi's Version nicht geht und ich lieber Marcel Gascoyne's nehmen sollte?

Werden die Konsolenausgaben als Textdadei behandelt? :gruebel:
Da bin ich noch nicht ganz hinter gestiegen... :roll:

Bye

Edit1: In welcher *.pas finde ich die SDK Function GetStdHandle :gruebel:
Edit2: In der Windows.pas, wer lesen kann ist klar im Vorteil... :wall:

Motzi 22. Nov 2004 17:24

Re: Wie die Error-Ausgabe erstellen im Konsolenprogramm??
 
In der Unit System gibt es 3 Variablen:
Delphi-Quellcode:
  Input: Text;           { Standard input }
  Output: Text;          { Standard output }
  ErrOutput: Text;       { Standard error output }
Diese kapseln die 3 Standard-Handles für (Überraschung ;)) Input, Output und Error. Wird bei Write(Ln)/Read(Ln) als erster Parameter kein TextRec oder FileRec übergeben setzt der Compiler automatisch entsprechend Output oder Input ein - entsprechend kannst du einfach ErrOutput verwenden. Denke nicht, dass es da irgendwo Probleme geben sollte..!

Kedariodakon 23. Nov 2004 08:26

Re: Wie die Error-Ausgabe erstellen im Konsolenprogramm??
 
Gut dann bleib ich bei der einfachen Methode, obwohl die andere auch funzt!
Also Dank an beide :thumb:

So ich mus weiter :coder:


Bye


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz