getline



  • Ich hätte noch eine weitere Frage:

    Habe mir jetzt was zusammen getragen was so aussieht:

    waffe.h

    [code]
    #pragma once
    
    #include "stdafx.h"
    
    using namespace std;
    
    class Waffe 
    { 
        public: 
        Waffe(string CName,string CDmg,string CKosten){Name = CName;Dmg = CDmg;Kosten=CKosten;} 
        string Name,Dmg,Kosten; 
    }; 
    
    class Waffenliste 
    { 
        public: 
        void add(Waffe item) 
        { 
            Liste.push_back(item); 
        } 
        vector<Waffe> Liste; 
    };
    

    [/code]

    .cpp

    [code]
    // get_line.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include "waffe.h"
    
    using namespace std;
    
    int main () 
    { 
      ifstream myfile ("text.txt");
      if(myfile.good()) 
    	{ 
    		while(!myfile.eof()) 
    		{ 
    			vector <string> v; 
    			for(string s; getline(myfile, s, ';'); v.push_back(s)); 
    				{
    				  if (v.size() >= 0)
    				  {
    					cout << v[1] << '\n'; 
    					cout << v[2] << '\n'; 
    					cout << v[3] << '\n'; 
    					cout << v[4] << '\n'; 
    					cout << v[5] << '\n'; 
    				  }
    				}
    		}
    	}
    	myfile.close();
    
    		Waffenliste liste; 
    		ifstream file("waffe.txt"); 
    		if(file.good()) 
    		{ 
    			while(!file.eof()) 
    			{ 
    			vector<string> zeile; 
    			string line; 
    			getline(file,line); 
    			 do 
    				{ 
    				//generiert Substring und fügt den gleich dem vektor hinzu 
    					zeile.push_back(line.substr(0,line.find(";"))); 
    				//wenn danach noch ein leerzeichen kommt löscht er bis zu diesem sonst alles 
    					if(line.find(";")!= string::npos) 
    					line.erase(0,line.find(";")+1); 
    					else 
    					line.erase(); 
    				} 
    				while(!line.empty()); 
    				liste.add(Waffe(zeile[0],zeile[1],zeile[2])); 
    				} 
    
    			} 
    			file.close(); 
    			for(unsigned int i = 0 ; i<liste.Liste.size();i++) 
    			cout << "Name: " << liste.Liste[i].Name << "(Dmg " << liste.Liste[i].Dmg << ",Kosten " << liste.Liste[i].Kosten << ")" << endl; 
    
      system("pause");
    }
    

    [/code]

    Es gibt mir einen Fehler aus und ich kann nur "Abort", "Retry" oder "Ignor* klicken.

    Was genau ist falsch?

    Ich möchte das die sachen aus Textfile waffe.txt auf die kalsse eingelesen wird.

    (Code hab ich aus einem anderem Theard)

    Gruss

    thomas1234


  • Mod

    Aha. Ein Fehler. Und man kann was klicken. Dann ist ja alles klar. Die Lösung ist einfach: Du musst die Schildfrequenz modulieren.

    Magst du dir nicht mal die bisherigen Antworten anschauen und versuchen, aus diesen zu lernen? Der Code den du jetzt gezeigt hast ist wieder dieses grausame :C-Einleseschleife mit C++-Mitteln umgeschrieben", was zwar compilieren mag, aber logisch falsch ist, da die C++-Mittel eine andere Logik als die alten C-Funktionen haben. Und zwischendrin hast du dann noch meine Lösung zwischen lauter sinnlosen Kontrollstrukturen (da mein Schleifchen sich schon um alles kümmert, aber du hast es nicht verstanden) eingeklemmt. Wenn du Code schreibst, dann musst du ihn auch verstehen. Code ist Logik pur, kein Haufen von aneinanderkopierter Fetzen aus dem Internet. Du musst genau wissen, an welcher Stelle du warum welches Zeichen setzt.



  • vector <string> v; 
                for(string s; getline(myfile, s, ';'); v.push_back(s)); 
                    {
                      if (v.size() >= 0)
                      {
                        cout << v[1] << '\n'; 
                        cout << v[2] << '\n'; 
                        cout << v[3] << '\n'; 
                        cout << v[4] << '\n'; 
                        cout << v[5] << '\n'; 
                      }
                    }
    

    verursacht vermutlich den Fehler. du hast nen Vector und sobald ein Element darin enthalten ist, versuchst du auf 5 zuzugreifen. Warum genau willst du den inhalt des Vectors hier ausgeben?

    edit: Mein Fehler, aber bei dieser Klammerung auch schwer zu lesen. Bist du sicher dass v nach Durchlauf der for-Schleife mindestens 6 Elemente enthält?



  • Dudemeister schrieb:

    vector <string> v; 
                for(string s; getline(myfile, s, ';'); v.push_back(s)); 
                    {
                      if (v.size() >= 0)
                      {
                        cout << v[1] << '\n'; 
                        cout << v[2] << '\n'; 
                        cout << v[3] << '\n'; 
                        cout << v[4] << '\n'; 
                        cout << v[5] << '\n'; 
                      }
                    }
    

    verursacht vermutlich den Fehler. du hast nen Vector und sobald ein Element darin enthalten ist, versuchst du auf 5 zuzugreifen. Warum genau willst du den inhalt des Vectors hier ausgeben?

    edit: Mein Fehler, aber bei dieser Klammerung auch schwer zu lesen. Bist du sicher dass v nach Durchlauf der for-Schleife mindestens 6 Elemente enthält?

    Die schleife selbst macht keinen Fehler wenn ich alles danach weglasse geht das ohne Problem.

    Ich habe dort die Ausgabe gemacht nur weill ich sehen wollte was passiert um zu verstehen wie das ganze funktioniert 🙂



  • Nunja, dann solltest du dein Programm mal debuggen. So ist deine beschreibung des Fehlers doch recht ungenau.



  • Dudemeister schrieb:

    vector <string> v; 
                for(string s; getline(myfile, s, ';'); v.push_back(s)); 
                    {
                      if (v.size() >= 0)
                      {
                        cout << v[1] << '\n'; 
                        cout << v[2] << '\n'; 
                        cout << v[3] << '\n'; 
                        cout << v[4] << '\n'; 
                        cout << v[5] << '\n'; 
                      }
                    }
    

    Dir ist aber klar, das der Code nach der Schleife nur einmal ausgeführt wird, nachdem die Schleife durchgelaufen ist? Wenn nicht, schau mal ganze genau hin.



  • @pyhax
    Ja das ist mir klar ^^
    Ich hab das ganze ja nur als Test eingebaut.
    Trozdem Danke 🙂

    @Dudemeister
    Hab das Problem behoben jetzt sieht es so aus:

    // get_line.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include "waffe.h"
    
    using namespace std;
    
    int main () 
    { 
      ifstream myfile ("text.txt");
      if(myfile.good()) 
    	{ 
    		while(!myfile.eof()) 
    		{ 
    			vector <string> v; 
    			for(string s; getline(myfile, s, ';'); v.push_back(s)); 
    				{
    				  if (v.size() >= 0)
    				  {
    					cout << v[1] << '\n'; 
    
    				  }
    				}
    		}
    	}
    	myfile.close();
    	Waffenliste liste; 
    	ifstream file("waffe.txt"); 
    	if(file.good()) 
    	{ 
    		while(!file.eof()) 
    		{ 
    		vector<string> zeile; 
    		string line; 
    		getline(file,line); 
    			do 
    			{ 
    			//generiert Substring und fügt den gleich dem vektor hinzu 
    				zeile.push_back(line.substr(0,line.find(";"))); 
    			//wenn danach noch ein leerzeichen kommt löscht er bis zu diesem sonst alles 
    				if(line.find(" ")!= string::npos) 
    				{
    					line.erase(0,line.find(" ")+1); 
    				}
    				else 
    				{
    					line.erase();
    				}
    			}
    			while(!line.empty()); 
    			liste.add(Waffe(zeile[0],zeile[1],zeile[2])); 
    			} 
    	}
    	file.close();
    	for(unsigned int i = 0 ; i<liste.Liste.size();i++) 
    	{
    		cout << "Name: " << liste.Liste[i].Name << "(Dmg " << liste.Liste[i].Dmg << ",Kosten " << liste.Liste[i].Kosten << ")" << endl; 
    	}
      system("pause");
    }
    


  • vector <string> v; 
    for(string s; getline(myfile, s, ';'); v.push_back(s)); 
    { 
       if (v.size() >= 0) 
       { 
           cout << v[1] << '\n'; 
       } 
    }
    

    hmm... das sieht immernoch komisch aus. Was du zum testen haben willst ist vermutlich:

    vector <string> v; 
    for(string s; getline(myfile, s, ';'); v.push_back(s))  // hier kein ;
    { 
    	cout << s;
    }
    


  • Dudemeister schrieb:

    vector <string> v; 
    for(string s; getline(myfile, s, ';'); v.push_back(s)); 
    { 
       if (v.size() >= 0) 
       { 
           cout << v[1] << '\n'; 
       } 
    }
    

    hmm... das sieht immernoch komisch aus. Was du zum testen haben willst ist vermutlich:

    vector <string> v; 
    for(string s; getline(myfile, s, ';'); v.push_back(s))  // hier kein ;
    { 
    	cout << s;
    }
    

    Danke für deine Antwort.

    Wenn ich das ";" weg neme stürzt das ganze Prog wieder ab.

    Und wenn ich cout << s; nehme erkennt es s nicht (weils s in der for schleife inizialisiert wird und nur in dessen Instanz funktioniert?)

    Gruss

    thomas1234



  • Mit dem obenn geschribenen Code erhalte ich folgende Ausgabe:

    Hallo und Herzlich willkommen
    Name: Speer<Dmg 50, Kosten 20>
    Name: Messer<Dmg 30, Kosten 10>
    Press any key to continue...

    text.txt

    ;Hallo und Herzlich willkommen;
    

    waffe.txt

    Speer.50.20.
    Messer.30.10.
    

    Ich möchte jedoch die Ausgabe ohne die < > bei <Dmg..>

    wie kommen diese Zustande und warum?

    Gruss

    thomas1234


Anmelden zum Antworten