Ein Parser implementiert eine Code-Grammatik.
Für jede Regel wird eine Funktion erstellt.
Ein Parser implementiert eine Code-Grammatik.
Für jede Regel wird eine Funktion erstellt.
– alle Daten werden zu chars
– In: bedeutet von aussen zur CPU.
– out: bedeutet von OS nach aussen
————————————————————————————-
istream
char Daten werden übergeben
ostream
sendet chars an eine Ort (file, konsole, speicher, ..)
ifstream [Daten in File ablegen]
– Datei als String mitgeben
ifstream stream_a {„input.txt“}
– Inhalt wortweise in String ablegen string temp
– Strings in Vektor speichern vector <string> input
while (stream_a >> temp) { // fill vector input.push_back(temp); }
ofstream [ lesen von einem file (wird als stream gemacht)]
cout << "Name of output file" string name_outputfile; cin >> name_outputfile; ostream stream_1 {name_outputfile}; if (! stream_1) error("Konnte nicht eingelesen werden.");
strukturiert einlesen
struct Inputdata { int hour; double temperature; };
cout << "Please enter input file name: "; string name_inputfile; cin >> name_inputfile; ifstream ist {name_inputfile}; if (!ist) throw ios_base::failure("can't open input file "+name_inputfile);
vector<Inputdata> temps; // structured vector int hour; double temperature; // read structured in while (ist >> hour >> temperature) { if (hour < 0 || 23 <hour) throw range_error("hour out of range"); // fill vector temps.push_back(Inputdata{hour,temperature}); }
strucktruriert ausgeben
// set brackets for clearer structure for (int i=0; i<input.size(); ++i) ost << '(' << input[i].hour << ',' << input[i].temperature << ")\n";
…
Iperf
Ist ein freie Software, um den Datendurchsatz auf TCP/IP-Netzen zu messen. Das Programm generiert UDP oder TCP Datenströme und funktioniert nach dem Server-Client-Prinzip.
# Client iperf3 -c <ip-server>
# Client mit Paketgrösse und Meesszeit 1 min iperf3 -c <ipserver> -l 1400 -t 60 -f k --get-server-output
# Server iperf3 -s
Befehle
– l : Packetgrösse
– t : Wie lange (in s). Standard: 10 s.
– i : Intervall der Pakete (in s). Standard: 1 s.
— get-server-output : Die Messwerte des Serverers
. erscheinen auch unter den Messwerten des
. Clients. So in 1 Datei beide Werte.
– f : Ausgabeformat der Messung.
. -f k bedeutet, dass alle angaben in k sind
-B : welche IP (bei mehreren Netzen, z.B. LAN und WLAN)
– u : UDP. Standard: TCP.
Eingabe Parameter über Konsole (Windows)
# Messinterval und Messzeit eingeben echo %1 %2 iperf3 -c -i %1 -t %2
Eingabe Paramter über Konsole (Linux)
echo "Messintervall: " $1 echo "Messdauer: " $2 iperf -c -i $1 -t $2
Theoretische Durchsatzraten WLAN
Allgemein cout und cin
– Aufgrund von Operator Overloading kann cout alle Datentypen ausgeben
– Standardformat für Zahlen ist hex
– #include <iostream> ist notwendig
– Die Eingabe über Konsole wird wortweise in cin gespeichert.
– Gibt man mehrere Wörter (mit Leerschlag getrennt) ein, so wird
. wenn cin nur 1 Varibale folgt, nur das erste Wort übernommen. Ansonsten
. braucht es nach cin mehrere Variablen.
– Wert = 0 wird nicht ausgegeben. Es erscheint ein Loch.
Es scheint, wie wenn kein Wert da ist.
Ausgabe dezimal
std::cout << std::dec << (int) var_1 << std::endl; std::cout << std::dec << (int) treeMemy[0] << std::endl;
Ausgabe bitwise
Es braucht zwei Schritte. Typcast vor dem Output direkt funktioniert nicht.
char var_1 = 5; std::bitset<8> bits(var_1); /funktion vor output std::cout << bits << std::endl;
– bitset muss als Library eingefügt werden
#indlucde <bitset >
Ausgabe char
– Char-Werte werden teilweise wie die 0-Werte nur mit einem Loch ausgegeben. Die Konversion zum Datentyp short hilft, dass man die Werte auf der Konsole sieht.
std::cout << (short) bitReadOut << std::endl;
Führende Nullen anzeigen
std::cout << setfill('0') << setw(5) << var_2<<
std::endl;
-setw() sagt, wie viele Stellen man insgesamt ausdruckt
.
token
Aufteilen des Streams in Pakete.
Die Paketunterteilung erfolgt über intelligente Funktionen.
Die Token an sich haben noch keine Bedeutung, es sind uninterpretierte Pakete.
parsen
Nennt man den Vorgang, der den Paketen (Token) eine Bedeutung zuteilt.
Es ist die Interpretation der Pakete.
Mit den Pipe-Operatoren < und > können streams übergeben werden.
Dies kann als Parameter für ein anderes Programm oder in eine Datei sein.
Eine Pipe ist ein Datenstrom zwischen zwei Prozessen.
Bzw. es ist der Ausgang der Daten des ersten Programmes, der Abgefangen wird.
programm1 >> daten >> programm2
programm1 | ausgabe.txt // Die daten werden in ausgabe.txt geschrieben
Das Ergebnis eines Programms wird als Eingabe eines anderen Programms verwendet
| <optionen
Programm 1 übergibt Datenstrom direkt Programm 2