Frage zu Filterprogrammen



  • Hallo zusammen,
    ich nehme in meinem Lehrbuch gerade das Kaptiel "Filterprogramme" durch. Dabei habe ich ein paar Probleme. Ich weiß zum einen nicht, was diese bringen sollen! Wo liegt der Vorteil. Als Beispiel wird folgendes einfaches Filterprogramm genannt:

    #include <iostream>
    #include <iomanip>
    #include <string>
    using namespace std;
    
    int main()
    {
    	string zeile;
    	int nummer = 0;
    
    	while(getline(cin, zeile))
    	{
    		cout << setw(5) << ++nummer << ": "
    			 << zeile << endl;
    	}  
    	return 0;
    }
    

    Angenommen ich nenne diese .cpp Datei "Filter.cpp", dann soll ich nun eine Standarteingabe umlenken könne (Was bedeutet umlenken?). Das sähe dann so aus:

    filter << text.dat //Alle Strings aus text.dat werden nun mit Zeilennummern versehen?
    

    Oder so...da werden dann alle Strings, die ich eingebe, in einer Datei gespeichert:

    [cpp]
    filter > datei.dat //Alle Dateien in datei speichern? (hä, die Codetags funzen nicht...
    [/cpp]

    Seit wann spielt denn der Dateiname eine Rolle? Schreibe ich solche Anweisungen in die gleiche cpp Datei also hier in "Filter.cpp"?

    Kann mir jemand vielleicht ein korrektes Beispiel zu diesem Code posten?

    Vielen Dank
    lg, freakC++



  • Ich komme nicht draus, was du willst.. Die beiden Code Stücke haben nichts miteinander zu tun und aus deiner Beschreibung werde ich auch nicht schlau.. Probier doch mal etwas besser zu erklären.

    Datei Namen haben grundsätzlich keinen Einfluss.



  • Damit ist das Pipe-lining in Konsolen gemeint, d.h. die Standard-(Unix bzw. DOS)-Befehle lesen von der Eingabe (STDIN bzw. cin) und schreiben auf die Ausgabe (STDOUT bzw. cout). Somit kann man dann mehrere Filter nacheinander ausführen lassen, d.h. ein Programm kriegt die Ausgabe des vorherigen Programms als Eingabe.
    Das Zeichen für das Pipe-lining ist der senkrechte Strich '|'.
    Und mittels der Dateiumlenkungszeichen '<', '>' und '>>' kann dann die Eingabe bzw. Ausgabe in Dateien geleitet werden.

    Beispiel:

    filter1 <datei1.dat | filter2 | filter3 >datei2.dat
    

    1. lese die Eingabe aus datei1.dat und gebe sie an das Programm filter1
    2. filter2 nimmt die Ausgabe von filter1 und gibt wiederum etwas aus
    3. filter3 liest die Ausgabe von filter2 und schreibt die Daten dann in die Datei datei2.dat (mit >> würden die Daten an die Datei drangehängt)

    So, dies wäre nun der erste Teil des Kurses...



  • Hallo,
    vielen Dank für die Antwort, doch irgendwie werde ich daraus noch nicht schlau. Ich versuche das nochmal anders zu beschreiben, damit es auch wirklich jeder versteht.

    Ich nehme momentan das Thema "Umlenkung von Standarteingabe und -ausgabe" durch. Dabei habe ich das oben gepostete Programm, dass einfach den eingegeben String mit einer Zeilennummer versieh und dann wieder ausgibt. Laut meines Buches ist es möglich die "Standardausgabe umzulenken". Das geschieht so, indem ich beispielsweise folgendes schreibe (das oben gezeigte Programm heißt "filter.cpp"):

    filter > datei.dat
    

    Damit soll das Programm zwar von der Tastatur lesen, aber die Ausgabe in die Datei "datei.dat" schreiben.

    1.) Ist diese Art von C++ gebräuchlich bzw. ist es sinnvoll sich damit zu beschäftigen (ich möchte aber auf jedenfall wissen, wie man in Dateien schreibt bzw Dateien ausliest)?

    2.) Ich verstehe die Syntax nicht. Wo muss ich diese Zeile Quelltext hinschreiben? Ich kann doch nicht einfach in mein Programm "filter" schreiben. das Wort wäre doch gar nicht deklariert und es wäre sicherlich nicht dadurch bekannt, nur weil die .cpp Datei so heißt! Wo muss ich diese Zeile hinschreiben bzw. wie wende ich sie an?

    3.) Wenn das so alter DOS Kram ist, den man in "modernen" Programmen sowieso nicht mehr anwedet, dann bitte ich euch, mir das hier auch noch zu sagen 😃 !

    Ich hoffe, dass ihr mein Problem versteht!

    Vielen Dank
    lg, freakC++


  • Mod

    Ich glaube hier liegt ein genereller Verständnisfehler vor:

    Die Umlenkung der Aus- und Eingabe geschieht auf Shellebene, also auf der Ebene deines Computersystems, auf der dein Programm ausgeführt wird. Diese ganzen Beispiele für Umleitungen die hier im Thred genannt wurden sind Kommandozeilen, mit denen du dein Programm startest. Im Quelltext deines Programms steht nichts davon!

    Das wichtige bei dieser Art der Programmierung ist, dass du für die Ein-/Ausgabe in deinem Programm die Streams verwendest, die mit der Standard-Ein-/Ausgabe verbunden sind. Das sind cin, cout, cerr und clog. Benutze sie auch entsprechend ihrer vorgesehenen Verwendung, also keine Fehlermeldungen nach cout sondern nach cerr.

    Der Benutzer deines Programm entscheidet dann, woher dein Programm Eingaben nimmt und wohin die ausgaben erfolgen. Diese Art der Programmierung ist sehr gebräuchlich - praktisch alle bekannten Kommandozeilenprogramme machen das so.


Anmelden zum Antworten