getline



  • SeppJ schrieb:

    Wirre Fragestellung, ich rate mal was du möchtest:

    for(string s; getline(myfile, s, '.'); v.push_back(s));
    

    Wenn du Fragen zu Funktionen der Standardbibliothek hast, z.B. wie das mit den Trennzeichen geht, dann schau doch mal in eine Referenz:
    http://www.cplusplus.com/reference/string/getline/

    Ja genau ich möchte einfach das es den Text bis zum Trennzeichen jeweils auf einen Vector speichert.

    mit deinem Code erhalte ich einen Error.

    Falsch angepasst?

    [code]
    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main () {
      string line;
      ifstream myfile ("text.txt");
      if (myfile.is_open())
      {
        while (! myfile.eof() )
        {
    	string s;
    	vector <string> v;
    	for(string s; getline(myfile, s, '.');
    	v.push_back(s));
    	cout << v[ 1 ] << endl; 
    	 }
        myfile.close();
       }
    
      else cout << "Unable to open file"; 
    
      system("pause");
    }[/code]
    

    Gruss

    Thomas1234


  • Mod

    314159265358979 schrieb:

    Gefällt dir jetzt auf meinen Vorschlag hin die for-Schleife generell besser? 😃

    Ja 😃

    mit deinem Code erhalte ich einen Error.

    Aha. Ich erhalte nur, dass system nicht bekannt ist, weil du cstdlib vergessen hast. Magst du vielleicht etwas genauer werden?

    Falsch angepasst?

    Auch. Mein Code war als Ersatz für all dein Gewusel gedacht. Ja, Ein- und Ausgabe kann man in C++ oft in 1-2 Zeilen schreiben, ohne umständliche verschachtelte Schleifenkonstrukte.

    int main () 
    {
      ifstream myfile ("test.cc");
      vector <string> v;
      for(string s; getline(myfile, s, '.'); v.push_back(s));
    
      if (v.size() >= 2) 
        cout << v[ 1 ] << '\n'; 
    }
    


  • SeppJ schrieb:

    314159265358979 schrieb:

    Gefällt dir jetzt auf meinen Vorschlag hin die for-Schleife generell besser? 😃

    Ja 😃

    mit deinem Code erhalte ich einen Error.

    Aha. Ich erhalte nur, dass system nicht bekannt ist, weil du cstdlib vergessen hast. Magst du vielleicht etwas genauer werden?

    Falsch angepasst?

    Auch. Mein Code war als Ersatz für all dein Gewusel gedacht. Ja, Ein- und Ausgabe kann man in C++ oft in 1-2 Zeilen schreiben, ohne umständliche verschachtelte Schleifenkonstrukte.

    int main () 
    {
      ifstream myfile ("test.cc");
      vector <string> v;
      for(string s; getline(myfile, s, '.'); v.push_back(s));
    
      if (v.size() >= 2) 
        cout << v[ 1 ] << '\n'; 
    }
    

    autsch! Bin ich dumm xD

    Vielen vielen Dank für deine Hilfe jetzt habe ich was ich gebraucht habe 😃

    Gruss

    thomas1234



  • 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