struct an Funktion übergeben.
-
Wenn du schonend arbeiten möchtest arbeite mit Zeigern und Referenzen bei größeren Strukturen.
Das Einsparen eines Rückgabewertes oder Parameters wirkt sich meist nicht spührbar aus. (Jedenfalls wenn man nicht gerade auf Microcontrollern rumhampelt bei denen es auf jedes Bit ankommt oder man wirklich extrem schnellen Code schreiben muss.)
-
Wie schon gesagt, solltest du in loadVokabeln die Maximallänge mit übergeben. Außerdem ließt deine whlie-Schleif einen Eintrag zuviel. Ich würde es mal so machen.
void loadVokabeln(ifstream &myFile, strVokabeln *myVocabulum, int size ) { string sLine; int i=0; while ( myFile.good() && i<size ) { getline(myFile, sLine); string::size_type pos = sLine.find(":"); if( myFile.good() && pos != string::npos) { myVocabulum[i].sDeutsch = sLine.substr(0,pos-1); myVocabulum[i].sEnglisch = sLine.substr(pos+1,sLine.length()); ++i; } } }
-
Also wenn du schon mit C++ arbeitest dann würde ich auch objektorientiert programmieren und nicht funktional.
Eine schöne Klasse für die Vokabeln ergäbe z.B. einen gewissen Sinn.
Ansonsten programmierst du ein Mischmasch aus C und C++ und dies ist kein sonderlich guter Programmierstiel.
-
ganz komisch habe grade fest gestellt das er mir narnicht mehr in die
while schleife will:while ( myFile.good() && i < iMaxLines) {so auch nicht:
while ( myFile.good()) {ganz komisch.
Dieses Problem tritte auf weill ich zuvor dieses machen:
iMaxLines = getFileLines( myFile );
-
Muss ich myFile wirde wie wieder Freigeben oder sowas in der art?
-
probiers ma mit myFile.close();
-
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++)