Aus Datei in Array schreiben
-
Danke für die Antworten. Werde die Codes mal studieren. Habe C++ in der Berufsschule und da haben wir leichte Aufgaben gehabt, wie Primzahlen ausgeben oder nen kleinen Taschenrechner programmieren, bubblesort und Datumsüberprüfung (alles Kosolenausgabe). Da ich jetzt Lust aufs Programmieren bekommen habe, wollte ich bissel tiefer in die Materie einsteigen und mich in der Freizeit weiterbilden. Vielleicht gehe ich nach der BS studieren und da kann man das gebrauchen.
-
Entweder bin ich blind oder noch nicht clever genug, aber wo genau in deinem Code werden die Zahlen ins Array geschrieben. In dem "try-Block" wird doch nur was überprüft, aber nichts ins array geschrieben. Oder nicht? Sonst blick ich eigentlich durch und es funzt auch.
Vielen Dank.
-
Hi, lies dir mal das da durch:
http://www.cplusplus.com/doc/tutorial/exceptions.html
Im Prinzip "versucht" (try) das Konstrukt etwas zu tun. Wenns nichtklappt "wirft" (throw) man einen Fehler, der "aufgefangen" (catch) wird. So in etwa könnt man es glaub ich erklären was da passiert, oder?
-
Gemunkel schrieb:
Entweder bin ich blind oder noch nicht clever genug, aber wo genau in deinem Code werden die Zahlen ins Array geschrieben. In dem "try-Block" wird doch nur was überprüft, aber nichts ins array geschrieben. Oder nicht?
Naja:
joomoo schrieb:
if(!(fin >> zahlen[i][j])){ // Hier ist der Knackpunkt throw std::string("Fehler beim lesen von Zahl!"); }Hier werden die Werte an das array übergeben und danach überprüft. Man könnte auch extra ne variable dekalrieren, aber so geht es schneller, finde ich.
-
Man könnte auch einfach die exception-maske für den stream setzen, dann kann man sich das if und throw in der schleife sparen.
-
Dr. Prof schrieb:
Man könnte auch einfach die exception-maske für den stream setzen, dann kann man sich das if und throw in der schleife sparen.
cool, wie geht das?
-
Da hab ich wohl zu kompliziert gedacht. Ich dachte, ich muss Zeile für Zeile jede Zahl einzeln auslesen und ins Array "per Hand" schreiben mit ner for-Schleife, aber das das so geht, schön.
C/C++ Code:
if(!(fin >> zahlen[i][j])){ // Hier ist der Knackpunkt
throw std::string("Fehler beim lesen von Zahl!");
-
Das ganze gefummels mit den Schleifen kann man sich auch sparen... Der Code wird durch die Verwendung von Streamiteratoren auf Filestreams nicht nur übersichtlicher und leichter wartbar, es existieren auch weniger Stellen andenen Programmierfehler gemacht werden können.
#include <cstdlib> #include <fstream> #include <iterator> #include <algorithm> using namespace std; int main() { ifstream is("datei"); istream_iterator<int> ii(is); istream_iterator<int> eos; int v[2][6]; copy(ii, eos, &v[0][0]); return EXIT_SUCCESS; }Ggf. lässt sich das Resultat überprüfen indem man vor das return folgenden Teil einfügt:
ostream_iterator<int> oi(cout, "\n"); copy(&v[0][0], &v[1][6], oi);Man beachte die Headerdatei iostream einzubinden!
-
Das ist echt cool! Aber eine Sache versteh ich noch nicht: Warum ist eos automatisch der End-Iterator von dem File???
mfg.
-
Der Standardkonstruktor zeigt automatisch auf das ende des streams. das ist so definiert.
-
lucky_tux schrieb:
Der Standardkonstruktor zeigt automatisch auf das ende des streams. das ist so definiert.
ja das meine ich auch schonmal gehört zu haben. Aber ist das ende von jedem Stream gleich oder wie genau muss ich das verstehen???
(Ich vergleich mir iterator immer mit den Pointern, aber dieses Problem konnte ich mir hiermit nicht erklären)mfg.
-
Das Ende des Streams wird durch ein Bit gesetzt. Definiert als
static const iostate eofbit;
Wie genau jedoch erkannt wird wann "der Stream" das Ende erreicht hat weiß ich selbst auch nicht so genau
-
lucky_tux schrieb:
Das Ende des Streams wird durch ein Bit gesetzt. Definiert als
static const iostate eofbit;
Wie genau jedoch erkannt wird wann "der Stream" das Ende erreicht hat weiß ich selbst auch nicht so genau
Ahh okay. Ich hab's verstanden. Scheint ne Besonderheit von den Streams zu sein, hab die ganze Zeit an sone Art myVector.end() gedacht. Vielen dank für die Erklärung.
mfg.