Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi mit Konsolenanwendung StdIn lesen (https://www.delphipraxis.net/60512-mit-konsolenanwendung-stdin-lesen.html)

VizeTE 8. Jan 2006 10:40


mit Konsolenanwendung StdIn lesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich möchte, wie die Überschrift schon sagt :zwinker:, mit einer Konsolenanwendung die Standardeingabe auslesen.
Hintergrund sind die Hooks von Subversion. Dort gibt es ein Verzeichnis wo man ausführbare Dateien ablegen kann. Je nach Name der Datei wird diese bei bestimmten Ereignissen ausgeführt.
U.a. werden dort per StdIn Informationen übergeben die ich gern auswerten möchte. Ich habe mal die entsprechende Template-Datei angehängt.

Ich habe bereits eine Konsolenanwendung geschrieben, die gestartet wird und die 5 angegebenen Parameter entgegennimmt. Ich habe aber leider keine Ahnung wie ich an die Daten aus der Standardeingabe herankomme.

Ich hoffe da kann mir jemand helfen,
Danke!

Niko 8. Jan 2006 16:38

Re: mit Konsolenanwendung StdIn lesen
 
Hi,

ganz einfach mit read oder readln.

Zum Beispiel:
Delphi-Quellcode:
var s: String;
// ...
while (not Eof) do
begin
  readln(s);
  // s verarbeiten
end;

VizeTE 9. Jan 2006 07:38

Re: mit Konsolenanwendung StdIn lesen
 
So funktionierts, das ist ja wirklich sehr einfach :wall:


Danke!

VizeTE 13. Jan 2006 16:56

Re: mit Konsolenanwendung StdIn lesen
 
im Laufe der Zeit hat sich dann doch noch ein Problem ergeben...
Und zwar der Fall wenn es nichts zu lesen gibt. Dann steht mein Programm still weil es auf Informationen wartet.

Kann man das noch irgendwie abfragen?
Vielleicht kann man irgendwie feststellen wieviele Bytes es zu lesen gibt oder etwas in die Richtung.

---Bernhard--- 13. Jan 2006 17:09

Re: mit Konsolenanwendung StdIn lesen
 
Ich galub das ist mit ReadLn nicht möglich.
Bei ReadLn wird erst der Befehl gegeben, dass der User was eingeben soll/kann. Dadurch wartet das Programm bis der User auf Enter drückt!

VizeTE 13. Jan 2006 17:57

Re: mit Konsolenanwendung StdIn lesen
 
Zitat:

Zitat von ---Bernhard---
Ich galub das ist mit ReadLn nicht möglich.

Ich versteif mich da ja auch nicht auf das ReadLn, wenn es da eine andere Möglichkeit gibt soll mir das auch recht sein.

omata 13. Jan 2006 19:20

Re: mit Konsolenanwendung StdIn lesen
 
Moin,

also bei mir bleibt das Programm nicht hängen, solange man eine Datei über StdIN an das Programm sendet.
Was machst du da?
Meinst du, wenn man das Programm einfach so aufruft?
Dann ist das Verhalten aber genau richtig!

MfG
Thorsten

VizeTE 16. Jan 2006 11:18

Re: mit Konsolenanwendung StdIn lesen
 
Zitat:

Zitat von omata
Meinst du, wenn man das Programm einfach so aufruft?

Ja, das meinte ich. Kann man das Abfangen? D.h. irgendwie prüfen ob es überhaupt was zu lesen gibt?

VizeTE 16. Jan 2006 11:27

Re: mit Konsolenanwendung StdIn lesen
 
...und noch ein Stoperstein, über den ich gestolpert bin...

Das einlesen von Umlauten macht mir noch ein wenig zu schaffen.
Ich habe versucht den Text mit CharToOEM zu konvertieren. Es wurde auch konvertiert aber leider nicht richtig. Da sind immernoch komische Zeichen. Es sind zwar andere wenn ich CharToOEM verwende aber leider keine gescheiten.

omata 16. Jan 2006 14:33

Re: mit Konsolenanwendung StdIn lesen
 
Hallo VizeTE,

Zitat:

Zitat von VizeTE
Zitat:

Zitat von omata
Meinst du, wenn man das Programm einfach so aufruft?

Ja, das meinte ich. Kann man das Abfangen? D.h. irgendwie prüfen ob es überhaupt was zu lesen gibt?

nein!
Kann man nicht. Dein Programm weiss nichts von einer Datei.
Dein Programm horcht was auf StdIN so los ist und wird beendet wenn es dort das Endezeichen (#26) liest.

Wenn du keine Datei an dein Programm sendest, wird StdIN auf die Tastatur gelegt. Das liegt nunmal in der Natur der Sache, sorry.

Wenn du sowas abfangen willst, darfst du nicht StdIN nehmen, sondern musst den Dateinamen übergeben und die Datei selber einlesen. Das ist nunmal so!

Zitat:

Zitat von VizeTE
Das einlesen von Umlauten macht mir noch ein wenig zu schaffen.

Tja, da ist dann die Frage wie erstellst du die Datei, die du an dein Programm übergibst?
Da es ja ein Konsolenprogramm ist, müstest du ja eigentlich z.B. das Programm Edit oder UltraEdit (und dann den Text konvertieren) nehmen.
Und zwar in ASCII, da Windows eine andere Zeichentabelle benutzt (ANSI).
Also Gegenfrage wie erstellst du deine Dateien, mit einem Windowsprogramm (z.B. Notepad)?
Dann kannst du mit...

Delphi-Quellcode:
function ANSI2ASCII(AText:string):string;
const MaxLength = 255;
var PText : PChar;
begin
  PText:=StrAlloc(MaxLength);
  StrPCopy(PText,AText);
  {$IFDEF WIN32}
  CharToOEM(PText,PText); {32Bit}
  {$ELSE}
  AnsiToOEM(PText,PText); {16Bit}
  {$ENDIF}
  Result:=StrPas(PText);
  StrDispose(PText);
end;
deinen Zeichen umwandeln, damit sie in deiner Anwendung richtig aussehen.

Ährlich gesagt habe ich keine Ahnung was du da eigentlich machen möchtest.

MfG
Thorsten

VizeTE 16. Jan 2006 15:02

Re: mit Konsolenanwendung StdIn lesen
 
Zitat:

Zitat von omata
Ährlich gesagt habe ich keine Ahnung was du da eigentlich machen möchtest.

Das hatte ich ja schon mal im einführenden Post beschrieben. Auf meinem Rechner läuft ein Subversion-Server. Dieser Server hat ein "Hooks"-Verzeichnis. D.h. bei bestimmten Aktionen sieht der Server in dieses Verzeichnis ob dort bestimmte Dateien liegen. Liegt dort eine Datei dann führt er diese aus.
Genau so eine Datei möchte ich schreiben. (bzw. habe ich, funktioniert auch schon gut aber noch nicht perfekt)

Zitat:

Zitat von omata
Wenn du sowas abfangen willst, darfst du nicht StdIN nehmen, sondern musst den Dateinamen übergeben und die Datei selber einlesen. Das ist nunmal so!

Das klappt ja unter den Umständen nicht. Normalerweise schreibt der Server auch immer etwas in die StdIn. Keine Ahnung ob man sich da aber 100%ig darauf verlassen kann. Daher wollte ich mich gegen diesen Sonderfall absichern. Wenn das nicht klappt dann gehts halt nicht.
Habe auch schon mal über Threads nachgedacht. Vielleicht kann man das einlesen in einen Thread verlagern. Wenn dieser dann ein bestimmtes Timeout überschreitet wird der Thread einfach beendet. Keine Ahnung ob das so leicht geht.

Zu deinem Codeschnipsel...
Macht das echt einen Unterschied ob ich AnsiToOEM oder CharToOEM benutze? Ich hatte das nicht probiert da ich mal in meinem PSDK nachgeschaut hatte. Dort war AnsiToOEM als veraltet und durch CharToOEM zu ersetzen gekennzeichnet. Daher bin ich davon ausgegangen, daß beide Methoden das gleiche machen.

omata 16. Jan 2006 15:11

Re: mit Konsolenanwendung StdIn lesen
 
Zitat:

Zitat von VizeTE
Zu deinem Codeschnipsel...
Macht das echt einen Unterschied ob ich AnsiToOEM oder CharToOEM benutze?

Durch den Compilerschalter wird doch sowieso nur eine benutzt. Und das sollte jetzt immer CharToOEM sein. Mir ging es eigentlich mehr darum, wie du deine Dateien erstellst (DOS- oder Windows-Zeichensatz?) und deshalb der Hinweis darauf wann du wie umwandeln must.

MfG
Thorsten

VizeTE 16. Jan 2006 16:43

Re: mit Konsolenanwendung StdIn lesen
 
Zitat:

Zitat von omata
Mir ging es eigentlich mehr darum, wie du deine Dateien erstellst (DOS- oder Windows-Zeichensatz?) und deshalb der Hinweis darauf wann du wie umwandeln must.

Wie gesagt, ich erstelle die Daten ja gar nicht. Das macht ja der Subversion-Server. Mit CharToOEM wandelt er irgendetwas um. Leider aber nicht richtig. Da kommen die Umlaute auch nur als Müll raus. Zwar anderer Müll als ohne CharToOEM aber leider immernoch Müll.

Also müßte es ja noch eine andere Möglichkeit zum umwandeln geben?!

omata 16. Jan 2006 17:12

Re: mit Konsolenanwendung StdIn lesen
 
Ja, kannst du den nicht mal diese Datei, die du an dein Programm übergribst mit Notepad oder Edit aufmachen und dir die Sonderzeichen ansehen?

Dann wüsste man doch schon mehr.
Außerdem welche Zeichen den nun genau? Umlaute?

MfG
Thorsten

VizeTE 18. Jan 2006 14:50

Re: mit Konsolenanwendung StdIn lesen
 
Zitat:

Zitat von VizeTE
Wie gesagt, ich erstelle die Daten ja gar nicht. Das macht ja der Subversion-Server.

Zitat:

Zitat von VizeTE
Da kommen die Umlaute auch nur als Müll raus.



Alle Zeitangaben in WEZ +1. Es ist jetzt 14:56 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