Seite 1 von 1

Pipe funktioniert nicht

Verfasst: Mo, 04. Jan 2016 15:17
von Wonderer
Hallo,

ich habe hier ein neues Programm geschrieben welches mir aus einer Datenbank selektiv eine CSV-Datei erstellt.
Das Programm gibt mir mittels '?' Meldungen aus ('z.b. IDs und Details von Datensätzen die übersprungen werden).

Wenn ich das Programm aufrufe läuft das auch wunderbar durch und ich sehe die Ausgabe im Fenster der Kommandozeile.
Da ich das jetzt über eine relativ große Datenbank laufen lassen möchte habe ich versucht über das '>' die Ausgabe
umzuleiten in eine Datei. Leider funktioniert das nicht - die Datei wird erstellt aber bleibt leer (auch keine Leerzeilen).

zum Testen habe ich gleich nochmal 'dir *.prg >test.txt' versucht und das funktioniert.

Wieso geht das mit der Pipe nicht wenn ich Ausgaben mit '?' generiere und wie bekomme ich das dennoch hin?

danke schon mal für die Hilfe!

Re: Pipe funktioniert nicht

Verfasst: Mo, 04. Jan 2016 15:29
von georg
Hallo,


zum einen geht es mit fOpen(), fWrite() und fClose() sicher deutlich besser.

Dazu kommt, dass der Anzeigebereich eines Xbase++-Programms nicht (wie bei DOS) einfach an den Monitor gesendet wird, sondern schon ein Windows-Fenster ist, das sich sehr gut tarnt. Das Piping leitet Ausgaben an den Monitor um, nicht aber Ausgaben an ein Windows-Fenster (Keiner würde das mit Word versuchen - Word sieht aber auch anders aus, das gebe ich zu). Ich hoffe, ich habe mich verständlich ausgedrückt.

Einen Versuch wert wäre die Umleitung mit 2> (siehe: https://support.microsoft.com/de-de/kb/110930), obwohl ich dem auch nicht viele Erfolgschancen einräume.

Re: Pipe funktioniert nicht

Verfasst: Mo, 04. Jan 2016 15:56
von Wonderer
georg hat geschrieben:zum einen geht es mit fOpen(), fWrite() und fClose() sicher deutlich besser.
Naja, ist ein Workaround aber nach meinem Verständnis müsste ein Console-Programm von XBase die Ausgaben ebenso machen
wie eine BAT-Datei - die dann in eine Datei umgeleitet werden kann. Andernfalls muss man ja komplett alle Ausgaben im Quellcode
als eigene Datei-Operationen umschreiben.
Das Piping leitet Ausgaben an den Monitor um, nicht aber Ausgaben an ein Windows-Fenster (Keiner würde das mit Word versuchen - Word sieht aber auch anders aus, das gebe ich zu). Ich hoffe, ich habe mich verständlich ausgedrückt.
Noch nicht so ganz - sorry.
Wenn ich dem Linker mit 'subsystem:console' angebe dass es ein Konsoleprogramm ist - dann macht '?' keine Ausgabe an STDOUT? :confused1:
Einen Versuch wert wäre die Umleitung mit 2>
Ja, das war ein Versuch ohne Erfolg.. :)

Re: Pipe funktioniert nicht

Verfasst: Mo, 04. Jan 2016 17:02
von Jan
Wenn Du die Ausgabe ohnehin nur mit ? machst - dann set doch SET ALTERNATE TO cDatei. Damit wird alles paralell in die angegebene Datei ausgegeben

Jan

Re: Pipe funktioniert nicht

Verfasst: Mo, 04. Jan 2016 18:33
von Wonderer
ah, nice..

vielen Dank, dass hilft mir sehr weiter!

Re: Pipe funktioniert nicht

Verfasst: Di, 05. Jan 2016 7:18
von brandelh
PIPE ist aber was anderes als eigene Ausgaben in eine Datei zu machen ... das ist ein Beispiel für einen PIPE Aufruf.

dir | MeinFilter > Ausgabe.Txt

damit das funktioniert, muss man die Eingaben von STDIN verarbeiten und auf STDOUT ausgeben.

die Eingaben zu verarbeiten hab ich nie mit Xbase++ gemacht,
aber der mit ? ausgegebene Text einer CONSOLEN Anwendung (GUI no) sollte mit > umlenkbar sein.

*** hab ich eben aber nicht hinbekommen :-(

Kann man mit FOPEN() STDIN / STDOUT öffnen ?

(Bei PowerBasic mache ich das so, das nutze ich auch für Tools die so arbeiten sollen.)

Re: Pipe funktioniert nicht

Verfasst: Mo, 08. Feb 2016 9:24
von Wonderer
brandelh hat geschrieben:PIPE ist aber was anderes als eigene Ausgaben in eine Datei zu machen ... das ist ein Beispiel für einen PIPE Aufruf.

dir | MeinFilter
Achsooo, danke :)

Ich habe jetzt überall eine Weiche drin je nach dem wo die Ausgabe erfolgen soll - eine UDF wäre da aber noch viel angenehmer zu lesen im Code.