Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Unterschied zwischen "|" (Pipe) und "<" (Umleitung)?

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50

    Unterschied zwischen "|" (Pipe) und "<" (Umleitung)?

    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

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50
    Ist aber anscheinend so. Wie in dem anderen Thread 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...

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50
    *push und hoff*

  5. #5
    Registrierter Benutzer
    Registriert seit
    20.07.2000
    Ort
    Österreich
    Beiträge
    189
    Zitat Zitat von KL47
    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:

    Code:
    while (!cin.eof())
    {
        // lese weitere zeichen ein
    }
    Geändert von Alex_K (22-11-2004 um 20:25 Uhr)

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Du könntest sonst mal auch den mytest-Code posten

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von KL47
    *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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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-lit....html#faq-15.5

  9. #9
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50
    Zitat Zitat von Alex_K
    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. Naja, das hab ich jetzt mit eof() umgangen, aber jetzt taucht wieder das vorherige Problem auf...
    Werds nochmal weiter versuchen. Sry fürs pushen.

  10. #10
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von locus vivendi
    Bei dem Code-Snippet aber aufpassen weil das nächste Zeichen EOF sein könnte.
    http://www.parashift.com/c++-faq-lit....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):
    Code:
    while( cin.peek() != EOF )
    {
    // lese weitere zeichen ein
    }
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •