Anfängerin braucht Hilfe! Einlesen aus einer Date und in Liste speichern



  • Mein Programm soll eine Eingabedatei als Parameter übergeben bekommen.
    Meine Idee ist:

    #include <string>
    #include <fstream>
    using namespace std;
    int main() 
    {	char dateiname[50] = 0;
    	char line[1000] = 0;
    	char type;
             int n,m; 
    
    cout << "Bitte Name der Datei, die Graphen enthält eingeben: " \n;
    cin >> dateiname;
    
    ifstream file (dateiname, ios::in | ios::nocreate);
    
    if (!file) 
    	{cout << "Es ist nicht möglich, diese Datei zu öfnnen.";
    	return 0;}
    

    Jetzt enthält diese Eingabedatei 3 Arten von Zeilen
    1. 1. Zeichen ist "c": nur Kommentar, soll überlesen werden
    2. 1. Zeichen ist ein "p" (1 Zeile), dahinter stehen 2 Zahlen, die erste soll der Variablen n zugeordnet werden, die zweite der Variablen m aus meinem Programm.
    3. 1. Zeichen ist ein "e" (m Zeilen )., dahinter stehen wieder 2 Zahlen zwischen 0 und n-1. Diese sind die eigentlich wichtigen.
    Ich will sie so abspeichern, daß ich eine Liste bekomme, oder besser eine Art Array mit n-1 Feldern, in denen die Zahlen 0 bis n-1 stehen. Von jedem Feld geht nun eine Liste ab, wobei das Arrayfeld den Kopf bildet. In dieser Liste stehen sämtliche "Partner" aus den Zeilen e. Also wenns ne Zeile mit "e 3 5" gibt, dann ist in der Liste, die an 3 hängt ne 5 drin und andersrum....

    Hier hab ich noch keine richtige Idee...

    if (!file.getline (line , 80)) return 0;	//liest eine Zeile
    
    while (1)
    	{ if (!(file >> type)) break;				//liest einen Wert
    	switch (type)
    	{	case c : break;
    		case p :
    

    😕 😕 😕

    Ich weiß nicht, wie ich auf die einzelnen Zahlen zugreifen könnte....

    Vielen vielen Dank, wenn mir jemand helfen kann !!!!

    jakky



  • Poste mal eine Beispiel Datei und wie dann deine Variablen aussehen sollen.

    mfg.



  • Eine Datei sieht zum Beispiel so aus:

    c Beispiel
    c
    c blabla
    p 4 5
    e 0 3
    e 1 2
    e 1 3
    e 2 3
    e 0 2

    Die Speicherung sollte dann so sein: n = 4, m = 5
    Und die Liste:
    0 -> 3 -> 2 oder 0 -> 2 -> 3 (Reihenfolge ist egal)
    1 -> 2 -> 3 oder 1 -> 3 -> 2
    2 -> 0 -> 1 oder ...
    3 -> 0 -> 2 ->1 oder...



  • war doch schon ganz ok wie du das hast

    while (file)
        { 
    
          char type;
          file >> type;                //liest einen Wert
    
          switch (type)
          { 
            case 'c' : 
            std::string comment;
            file>>comment; // klappt nur mit einwörtigen Kommentaren, wenn welche drin sein sollen die mehr Worte haben mit getline oder eine kommentarabschluss /c oder so arbeiten 
            break;
            case 'p' :
            int z1, z2;
            file>>z1;file>>z2;
            // was mit z1/z2 machen
            break;
    
            usw
    


  • while (file)
    		file >> type;				// liest einen Wert ein
    
    		switch(type)
    		{	case 'c':	file.getline (line, 100);  //bis zur naechsten Zeile vorrücken, max. 100 Zeichen
    						break;
    			case 'p':	int n,m; 
    						file>>n; 
    						file>>m;
    						file.getline (line, 100);  //bis zur naechsten Zeile vorrücken, max. 100 Zeichen
    						break; 
    
    			case 'e':	file >> c1;
    						file >> c2;
    						kante_einfuegen(c1,c2);
    						file.getline (line, 100);  //bis zur naechsten Zeile vorrücken, max. 100 Zeichen
    						break;
    

    Kann ich das so lösen, damit er nachdem er die benötigten Zeichen gelesen hat, in die nächste Zeile springt ?

    Und dann hab ich noch ne Frage: Bei mir taucht bei

    void visitbfs (int k)
    	{
             int j;
    	static int i = 0;
    	ListNode *t;
    	queue_put (k);
    	while (! queue_empty())
    	       {	j = queue_get();
    		a[j].count = ++i;
    		cout << a[j].name << "  ";
    		for ( t = a[t].next; t; t = t  -> next)
    		 if (a[t -> index].count == 0)
    		  {queue_put( t-> index); a[ (t-> index)].count = -1;}
    	        }
    }
    

    immer für die for-Schleife folgender Fehler auf: "error C2107: illegal index, indirection not allowed" bzw. "error C2228: left of '.next' must have class/struct/union type" auf. Was mache ich falsch ?



  • jakky schrieb:

    while (file)
    		file >> type;				// liest einen Wert ein
    	
    		switch(type)
    		{	case 'c':	file.getline (line, 100);  //bis zur naechsten Zeile vorrücken, max. 100 Zeichen
    						break;
    			case 'p':	int n,m; 
    						file>>n; 
    						file>>m;
    						file.getline (line, 100);  //bis zur naechsten Zeile vorrücken, max. 100 Zeichen
    						break; 
    
    			case 'e':	file >> c1;
    						file >> c2;
    						kante_einfuegen(c1,c2);
    						file.getline (line, 100);  //bis zur naechsten Zeile vorrücken, max. 100 Zeichen
    						break;
    

    Kann ich das so lösen, damit er nachdem er die benötigten Zeichen gelesen hat, in die nächste Zeile springt ?

    Kannst du machen, allerdings würde ich die Deklaration von n und m vor die Schleife setzen (ich gehe davon aus, daß du sie noch brauchst).

    Und dann hab ich noch ne Frage: Bei mir taucht bei

    void visitbfs (int k)
    	{
             int j;
    	static int i = 0;
    	ListNode *t;
    	queue_put (k);
    	while (! queue_empty())
    	       {	j = queue_get();
    		a[j].count = ++i;
    		cout << a[j].name << "  ";
    		for ( t = a[t].next; t; t = t  -> next)
    		 if (a[t -> index].count == 0)
    		  {queue_put( t-> index); a[ (t-> index)].count = -1;}
    	        }
    }
    

    immer für die for-Schleife folgender Fehler auf: "error C2107: illegal index, indirection not allowed" bzw. "error C2228: left of '.next' must have class/struct/union type" auf. Was mache ich falsch ?

    Ich vermute einen Tipfehler: "for(t=a[j].next;t;t=t->next)"


Anmelden zum Antworten