PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unterschied zwischen "|" (Pipe) und "<" (Umleitung)?



KL47
21-11-2004, 16:01
Hallo,

ich habe ein Programm ("mytest"), was bei Übergabe eines Streams diesen lesen und ausgeben soll. Also wenn ich "mytest < textdatei.txt" eingebe gibt er die Textdatei auf der Standardausgabe aus.

Soweit funktioniert das, aber wenn ich "cat textdatei.txt | mytest" eingebe, also die Ausgabe von cat zu mytest weiterleite, passiert überhaupt nichts, bzw. das selbe wie wenn ich "mytest" aufrufe. Ansonsten ist aber alles richtig, wenn ich stattdessen "cat textdatei.txt | less" aufrufe wird die Datei ausgegeben...

Im bash-Manual stand, dass die Standardausgabe des einen Programms als Standardeingabe des anderen Programms verwendet wird, es müsste also eigentlich funktionieren...

Danke für eventuelle Ideen ;)

peschmae
21-11-2004, 16:25
Das finde ich äusserst Merkwürdig, denn meines Wissens sollte cat <datei> | und < für das nachher folgende Programm wirklich exakt dasselbe sein.

MfG Peschmä

KL47
21-11-2004, 17:59
Ist aber anscheinend so. Wie in dem anderen Thread (http://www.mrunix.de/forums/showthread.php?t=36781) schon gepostet, lese ich von dem Stream die Länge aus. Wenn ich das per Umeleitung - also "<" - mache, wird die Länge korrekt ausgegeben und alles funktioniert, aber bei der Pipe ist die Länge immer -1...

KL47
22-11-2004, 16:03
*push und hoff*

Alex_K
22-11-2004, 21:22
lese ich von dem Stream die Länge aus. Wenn ich das per Umeleitung - also "<" - mache, wird die Länge korrekt ausgegeben und alles funktioniert, aber bei der Pipe ist die Länge immer -1...

ich vermute mal dass bei der pipe die beiden prozesse paralell ablaufen, weshalb das 2 programm auch nicht wissen kann wie lange der eingabestram ist, das 1. programm kann ja unbestimmt lang weiterschrieben.

die umleitung von des stdin (<) wird vermutlich gepuffert, es wird gewartet bis das 1. programm fertig geschrieben hat, und danach wird es erst ans 2. weiter gegeben.

du solltest nicht die länge der datei überprüfen sondern so lange lesen bis du das zeichen eof (end of file) bekommen hast.

ich bin zwar etwas aus der übung aber es sollte etwa so funktionieren:



while (!cin.eof())
{
// lese weitere zeichen ein
}

peschmae
23-11-2004, 08:28
Du könntest sonst mal auch den mytest-Code posten ;)

MfG Peschmä

anda_skoa
23-11-2004, 16:06
*push und hoff*

Es gibt keine immer gültige Definiton einer Streamlänge, du kannst schliesslich auch nicht beim Einstecken eines Geräts in die Steckdose sagen, wann kein Strom mehr rauskommen wird, du kannst lediglich erkennen, wann dieser Zeitpunkt eintritt.

Und gepusht wird hier sowieso nicht!
Nicht mal 24 Stunden seit dem anderen Posting und soviel neue Threads entstehen hier in dieser Zeit nicht dass der Thread auf der nächsten Seite "verschwinden" würde.

Ciao,
_

locus vivendi
23-11-2004, 16:48
du solltest nicht die länge der datei überprüfen sondern so lange lesen bis du das zeichen eof (end of file) bekommen hast.

ich bin zwar etwas aus der übung aber es sollte etwa so funktionieren:

Code:

while (!cin.eof())
{
// lese weitere zeichen ein
}

Bei dem Code-Snippet aber aufpassen weil das nächste Zeichen EOF sein könnte.
http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.5

KL47
24-11-2004, 19:20
ich vermute mal dass bei der pipe die beiden prozesse paralell ablaufen, weshalb das 2 programm auch nicht wissen kann wie lange der eingabestram ist, das 1. programm kann ja unbestimmt lang weiterschrieben.
Jepp, das wars, hab ich natürlich nicht bedacht. :rolleyes: Naja, das hab ich jetzt mit eof() umgangen, aber jetzt taucht wieder das vorherige Problem auf... :D
Werds nochmal weiter versuchen. Sry fürs pushen. ;)

panzi
24-11-2004, 22:43
Bei dem Code-Snippet aber aufpassen weil das nächste Zeichen EOF sein könnte.
http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.5
Um dem vozubeugen könnte man ja das verwenden. Nur wird dann beim peek unter umständen gelesen (wenn der puffer leer ist):

while( cin.peek() != EOF )
{
// lese weitere zeichen ein
}