char aufteilein und listen



  • Hallo,

    ich versuche derzeit aus einer liste mit 600 schülern:
    vorname;nachname;3;4;1;
    einzelne Zeilen auszulesen.
    Das ist mir ebreits gelungen:

    char ch[255];
    while (fin.getline(ch,255))
    {
    cout << ch << "\n";
    }
    

    nun weiss ich aber nicht, wie ich diesen char aufteile (immer beim semikolon) und wie ich dann 600 dieser reihen auf einmal im programm verfügbar habe.

    hoffe ihr könnt mir helfen,
    sun



  • am einfachsten ist es, wenn du mit der klasse string arbeitest :), denn die klasse string bietet eine doch angenehme vielzahl von möglichkeiten, diese operationen, die du benötigst, zu nutzen

    1. lies in einen string ein
    2. die klasse string bietet die methode find() zum finden eines zeichens
    3. mit der methode substr() kannst du dann die einzelnen felder auslesen
    4. und um die datensätze dann noch zu speichern, baust du einen vector, oder ähnliches

    ...so würde ich rangehen 😉

    mfg



  • Bei allem Respekt vor der String-Klasse, aber mit find würd ich da nicht arbeiten:

    char line [255]; // den bezeichner ch verwendet man normalerweise nur für *ein* zeichen
    while (fin.getline(line,255))
    {
        char vorname [16];
        char nachname [16];
        int wert1, wert2, wert3;
    
        sprintf(line,"%s;%s;%d;%d;%d",vorname,nachname,&wert1,&wert2,&wert3);
    }
    

    MfG SideWinder



  • 😃 ich hab das grad ma probiert, und das geht, vorraussetzung ist, dass die datei test.txt genau nach deinen vorgaben aufgebaut ist, also mit semikolon getrennt 🕶

    #include <string>
    #include <fstream>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    struct Datensatz
    {
    	string vorname,nachname;
    	int eins,zwei,drei;
    	Datensatz(string v,string n,int a,int b,int c):vorname(v),nachname(v),eins(a),zwei(b),drei(c){}
    };
    
    ostream&operator<<(ostream&os,Datensatz a)
    {
    	os << a.vorname << ' ' << a.nachname << ' ' << a.eins << ' ' << a.zwei << ' ' << a.drei;
    	return os;
    }
    
    typedef vector<Datensatz > Liste;
    
    int main()
    {
    
    	string line;
    	string vn,nn;	//vorname, nachname
    	int a,b,c;		//die drei zahlen
    	int tmp=0;
    	ifstream ein("test.txt");
    	Liste liste;
    
    	//einlesen der datei
    	while(ein>>line)
    	{
    		vn=line.substr(0,tmp=line.find(';'));	//vorname
    		line=line.substr(++tmp,line.size());
    
    		nn=line.substr(0,tmp=line.find(';'));	//nachname
    		line=line.substr(++tmp,line.size());
    
    		a=atoi(line.substr(0,tmp=line.find(';')).c_str());	//erste zahl
    		line=line.substr(++tmp,line.size());
    
    		b=atoi(line.substr(0,tmp=line.find(';')).c_str());	//zweite zahl
    		line=line.substr(++tmp,line.size());
    
    		c=atoi(line.c_str());					//dritte zahl
    
    		liste.push_back(Datensatz(vn,nn,a,b,c));	//in vector speichern
    
    	}
    
    	//ausgabe der datei 
    	for(Liste::iterator it=liste.begin();it<liste.end();++it)
    	{
    		cout << *it << endl;
    	}
    
    	return 0;
    }
    

    ...jaja, es gibt noch andere möglichkeiten, ist aber eine lösung 😉
    ...hehe, und doch mit strings 😃

    mfg


Anmelden zum Antworten