struct an Funktion übergeben.
-
Ja, mußt du - C++ setzt die Fehlerflags des Files nicht wieder zurück (d.h. nach dem getFileLines() Aufruf steht der Stream am Ende der Datei (dagegen hilft seekg()) und hat das eofbit gesetzt (kannst du mit clear() wieder zurücksetzen).
-
Mr Evil schrieb:
probiers ma mit myFile.close();
ich will es ja nicht schliessen.
ich ahbe es schon versucht indem ich den Poiter wieder am anfang gesetzt habe:
myFile.seekg (0, ios::beg);
geht leider auch nicht.
-
Lösung:
myFile.clear(); myFile.seekg (0, ios::beg);besten dnak CStoll. haber es halt nur amanfang gesetzt ohne das eofbit weg zu machen.
Danke
gruß
zyon
-
Z2 schrieb:
Nackte Arrays zu verwenden ist übrigens unklug. Dafür sollte man lieber einen std::vector nehmen. Die sind einfacher zu handhaben
Irgendwie weiß icht nicht wie meine struct:
struct strVokabeln { std::string sDeutsch; std::string sEnglisch; }; struct strVokabeln *myVokabel; myVokabel = new strVokabeln[iMaxLines];als vector aussehen soll. Sprich ich brauch 2 vectoren.. oder? Kann mir da jemand helfen?
-
#include <vector> std::vector<strVokablen> myVokabel;
-
Nein, du brauchst nur einen vector:
struct strVokabeln { std::string sDeutsch; std::string sEnglisch; }; std::vector<strVokabeln> Woerterbuch;jetzt kannst du mit push_back() neue Wörter einfügen, die Größe per resize() anpassen, über []-Operator auf einzelne Elemente zugreifen etc.
(im Magazin findest du den Artikel "Aufbau der STL 1", dort solltest du mal reinlesen)
PS: Als Bonus könntest du deinem struct noch einen Konstruktor und Stream-Operatoren verpassen.
-
Zugriff wird wohl so gehen.
iMaxLines = getFileLines( myFile ); vector < strVokabeln > Woerterbuch; Woerterbuch.resize(iMaxLines); Woerterbuch[1].sDeutschDas ich mit push_back() reinschreiben kann ist mir auch klar. Aber wie unterscheid ich das dann in die einzelnen Felder (sDeutsch,sEnglisch)?
CStoll schrieb:
PS: Als Bonus könntest du deinem struct noch einen Konstruktor und Stream-Operatoren verpassen.
?
Besten Dank
CStoll
-
zyon schrieb:
Das ich mit push_back() reinschreiben kann ist mir auch klar. Aber wie unterscheid ich das dann in die einzelnen Felder (sDeutsch,sEnglisch)?
Wie du es oben schon gemacht hast: "Woerterbuch[i].sDeutsch" für den Deutsch-Teil, "Woerterbuch[i].sEnglisch" für den Englisch-Teil der i-ten Vokabel.
CStoll schrieb:
PS: Als Bonus könntest du deinem struct noch einen Konstruktor und Stream-Operatoren verpassen.
?
Der Konstruktor ist recht nützlich, um dir Schreibarbeit zu ersparen, damit kannst du statt
strVokabeln vok; vok.sDeutsch = "Hund"; vok.sEnglisch = "dog"; Woerterbuch.push_back(vok);einfach alles zusammenfassen zu:
Worterbuch.push_back(strVokabeln("Hund","dog");(außerdem finde ich, daß eine Klasse mit Konstruktoren leichter zu handeln ist)
Stream-Operatoren kannst du definieren, um eine Vokabel über IO-Streams eingeben zu können (ist aber nicht unbedingt erforderlich)
PS: Ein Vorteil von vector<> ist, daß er mitwachsen kann - du mußt also nicht die Größe im Voraus berechnen:
string zeile; while(getline(myFile,zeile)) { size_t trenn = zeile.find(' '); Worterbuch.push_back(strVokabeln(zeile.substr(0,trenn),zeile.substr(trenn+1))); }
-
CStoll schrieb:
PS: Als Bonus könntest du deinem struct noch einen Konstruktor und Stream-Operatoren verpassen.
?
Der Konstruktor ist recht nützlich, um dir Schreibarbeit zu ersparen, damit kannst du stattFinde das ganze sehr nett, aber wie kann ich den einen Konstruktor eine struct zuweissen? Versehe das mit dem Konstruktor nicht so ganz.
-
Eine struct ist auch nur eine class, bei der alle Elemente auf public gesetzt sind. Also kann sie genau wie eine class Memberfunktionen und Konstruktoren/Destruktoren erhalten. In deinem Fall sieht das etwa so aus:
struct strVokabeln { string sDeutsch; string sEnglisch; strVokabeln(const string& de,const string& en) : sDeutsch(de),sEnglisch(en) {} };(PS: Und ich empfehle dir ein Buch über die Grundlagen von C++)