C++: Fehlerhandling

Errorfunktion selber schreiben

void error( std::string message){
    std::cout << message << "\n";
} 


// im code anderer Funktion
if (input < 0) {
   error("ungültiger Wert. \n");
}

Dient zum Überprüfen falscher Argumente
.

Exceptions (Klasse verarbeitet Fehler)
Exceptions trennen den Fehlererkennung  (in Funktion) vom  Verarbeitungsort (main).

– Es wird ein Klasse pro Fehlertyp definiert
.  Aufgabe der Klasse: Fehlermeldung werfen
– Im main werden die Fehlermeldungen global gesamelt

// Notwendige Infrastruktur: Leere Fehlerklasse
class Zero_Input{  };

// Fehlerdetektion in Funktion
int get_value(){
     if (cin == ""  || cin == "0"){
         throw Zero_Input{};
     }
}

// Fehlerbehandlung aufgrund der Klassen
int main()
try{ 
      <code main>
   }
catch( Zero_Input ){
      std::cerr<< "Ops. Leerer Input \n";
      return 1;
}

– main() ist ohne geschweifte Klammern !
– Fehlerausgabe auf std:cerr nicht auf std::cout
Returnwert hat einen Wert unterschiedlich von 0

c++: vector as new type in -std=c++11

Eine sichere Alternative zum Array!

#include <vector>
std::vector <int> messungen = { 12, 10, 11, 12, 10 };
std::vector <string> klasse_1b = { "eva", "tim", "lin", "noe" };
std::vecrot <Class> token_table = { "n", 5, "+", 2, "*", 4 };


Wertzuweisung

messungen[1] = 11;
token_table[2] = { "*", 3 }

 

Vektor per Referenz übergeben
Damit nicht alle Werte des Vektors übergeben werden müssen, wird nur die Adresse übergeben (siehe Pointer).

void print( const vektor <int>& messungen){
.   // code
}

Zur Referenzübergabe gehört sowohl das & (Adresse mitgeben).

Mit 0 oder leeren Strings initialisieren

std::vector <int> messungen( 5 );
std::vector <string> klasse_1b( 4 );

Achtung: geht nur, wenn man mit -std=c++11 kompiliert.

for eines Vektors

for (int i : messungen){
.    (if i = 5 ) {
.        //
.     }
}

Das verkürzte For für einen Vektor gibt zu Beginn den Datentyp an und nach dem Doppelpunkt die Länge des Vekorts. Dann geht das For durch jedes Elements des Vektors.

for eines Vektors aus einem Klassen-Datentyp

for (Token t: token_table){
.    (if t.nummer == 5) {
.        //
.     }
}

Wieder zuerst der Datentyp (Token) und dann den Vektor.
Bei der interenen Auswertung, muss gesagt werden, auf welchen Variabelntyp der Klasse sich die Auswertung bezieht. (Bei der Klasse Token hat jeder Index zwei Variablen: string operation und int nummer.)

 

Funktionen für Vektorbearbeitung

int anzahl = messungen.size();
messungen.sort();


Daten in Vector einlesen

vector <int> data;
int current_element;

while ( cin ){
    cin >> current_element
     data.push_back ( current_element );
}

– Die Funktion push_back() hängt neue Daten hinten an.
– Sie vergrössert die Vektorgrösse damit immer um 1

 

c++: Ausgabe Konsole: cout <<

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

.

 

 

c++: einlesen mit >>

in = von aussen IN eine Datei (ablegen)
out = von Datei nach aussen geben

#include <iostream>
#include <string>

Über die Konsole kann wortweise über cin eingelesen werden.

std::cin >> wort1;   // ablegen in variable

Will man über die Konsole mehrere Wörter eingeben, so braucht man mehrere Variablen, zum Speichern. Der Datentyp von Eingabe und Variable müssen stimmen.

std::string name;
int alter;

std::cout << "Eingabe Name und Alter \n";

std::cin >> name >> alter

 

Stream ablegen

string datei_name = {"data.txt"};
ifstream stream_a {datei_name};
cout << "Name des Files angeben"; 
string datei_1;
cin >> datei_1 
ifstream stream1 {datei_1}


Einlesen bis

std::string current = "";
std::string end = ".";

// 1.Variante
while ( std::cin >> current ) {
  if (current == end){
      // do action;    
  }
}

Im While wird wortweise eingelesen und das Wort in den String current abgelegt.
Sobald ein spezifisches Wort erscheint, wird eine bestimmte Anweisung erteilt.

Fehlerbehandlung

if (!cin ) {
  error(" Einlesen funtkonierte nicht \n");
}
else {
     do something;
}