Array schreiben



  • Sorry das ich diese vermeindlich einfache Frage hier stelle, aber ich weiß nicht mehr weiter. Ich bekomme unter C++ einfach keine Arrays hin.
    Wenn ich in einer Text Datei:

    16;7;Bibo

    stehen habe, wie kann ich das in ein Array abspeichern?

    int 	 i = 0;
    char 	 Geburtstage[1024][1024];
    

    das hier dann in einer Schleife:

    Geburtstage [i][zeile];
    i++;
    

    Aber das funktioniert nicht. Ist Char das richtige?
    Ich möchte danach das Array auf das Datum überprüfen und "Bibo" ausgeben können.
    Das er bei einem ";" eine neue Zeile anfängt, hab ich schon geschafft.
    Kann mir irgendwer weiter helfen?



  • char Geburtstage[1024][1024];

    Was du hier machst ist 1024*104 char's zu reservieren. Das wirst du kaum brauchen.

    Geburtstage [i][zeile];

    Das gibt dir das char aus, das an der Stelle [i][zeile] ist.

    Ansonsten verstehe ich nicht ganz, was du willst, wenn du nicht ein bisschen mehr Code zeigst.. 🙄



  • EDIT: Nicht grob, getestet.

    #include <fstream>
    #include <string>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    //...
    
    struct Geb{
        int day;
        int month;
        string name;
    };
    
    int main(){
        ifstream file("geb.txt");
    
        vector<Geb> gebs;
    
        while(!file.eof()){
    	char delim;
    	Geb geb;
    	file >> geb.day >> delim >> geb.month >> delim;
    	getline(file, geb.name);
    	gebs.push_back(geb);
        }
    
        for(int i = 0; i < gebs.size(); ++i){
    	cout << gebs[i].name << ": " << gebs[i].day << "." << gebs[i].month << endl;
        }
    }
    


  • Das is mein Code bis jetzt.Also zumindest der Auszug der nicht funktioniert. Blödes Char array. Der soll das ja auch nur in dem Array speichern und dann soll das durchsucht werden. Aber erstmal speichern is wichtig. Wenn ich weiß wie das funktioniert, dann sollte das mit dem durchsuchen eigentlich ja nicht mehr so schwer sein.

    #ifdef HAVE_CONFIG_H                                                            //Kurzschreibweise für #if defined
    #include <config.h>
    #endif
    
    #include <iostream.h>
    #include <fstream>
    #include <stdlib.h>
    #include <assert.h>
    #include <stdio.h>
    
    using namespace std;
    
    //Textdatei einlesen				
    	char     filename[128] = "test.txt";
    	ifstream file;
    	char     zeile[1024];
    	int 	 i = 0;
    	char 	 Geburtstage[1024][1024]; 
    
    	// Dateinamen einlesen
    	//cout << "Dateinamen eingeben: " << flush;
    	//cin.getline(filename, 127);
    
    	// Datei öffnen
    	file.open(filename, ios::in);
    
    	if (file.good())
    		{
    		// Wenn die Datei geoeffnet werden konnte...
    
    		// An den Anfang der Datei springen
    		file.seekg(0L, ios::beg);
    
    		while (! file.eof())
    		{
                    // Die Datei zeilenweise auslesen
    	        file.getline(zeile, 1024, ';');
    		cout << zeile << endl;
    		Geburtstage [i][zeile];
    		i++;
    		}
    		}
    		else
    		    {
    		     // Wenn die Datei nicht geoeffnet werden konnte,
    		     // aus welchen Gruenden auch immer...
    		     cout << "Datei nicht gefunden." << endl;
    	            }
    

    @ Fellhuhn: Der hat nen 4 Fehler. Ich schaff es leider nicht, sie zu beheben. Bin halt absoluter Neuling. Steig noch nicht ganz durch den Vector durch. Der Ablauf deines Programms ist mir jedoch einleuchtend.



  • Habs noch einmal überarbeitet (siehe oben).

    Vektoren solltest du dir unbedingt anschauen. Im Endeffekt kannst du damit umgehen wie mit normalen Arrays (zumindest der Zugriff) dafür sind sie sicherer und wesentlich flexibler.

    Du könntest aber auch eine Map nehmen, mit dem Namen als key und dem Geburtstag als Value. Das würde zumindest Suchen sehr vereinfachen.



  • Das Ding ist, wir haben vor einer Woche die Aufgabe bekommen uns ein C++ Programm zu suchen und das halt zu erweitern. Ohne Vorkenntnisse usw. Die anderen haben alle Taschenrechner usw. Irgendwie hab ich mir das falsche ausgesucht. Naja...sowas is doch kacke. Auf jedenfall sollen wir das nach den Ferien abgeben und ich muss hier auch noch fürs Abi lernen. Ich kapiere ja jetzt schon wie das Programm arbeitet usw. Aber ich kanns halt nicht wirklich erweitern. Klar kleine Spielereien sind möglich. Wie if-Schleifen usw. Die kenne ich ja aus PHP Java usw. Aber ich kann in C++ noch nicht mal ein array anlegen. Ich versuch jetzt hier schon eine Stunde lang ein array zu schreiben wo ich einfach nur "lol" rein schreibe und mir das dann auszugeben. Aber dann stürzt das Programm ab.
    Ich weiß wirklich nicht was du da mit Map meinst und die anderen Funktionen. Hätte ich mehr Zeit könnte ich mir das alles zurecht pusseln denke ich mal aber wenn man einfach so ins kalte Wasser geworfen wird...naja.
    Hat hier mal wer eine gute Anleitung für Arrays oder Vectoren. Damit ich das mal verstehe wie ich die anlege. Müsste aber für Mehrdimensionale sein, da ich ja Tag und Monat vergleichen muss. Nicht oder?



  • Saftei schrieb:

    ...Wie if-Schleifen usw...

    Das gibt definitiv Punktabzug in der Abiklausur. If ist keine Schleife 😉



  • Was willst du denn genau damit machen?

    Du erstellst mit int meinArray[10][10] schon ein Array. Allerdings eines mit 10 x 10 Feldern. Im Grunde wie eine Matrix.

    In meinem Beispiel hast du einen Vector mit Einträgen vom Typ Geb (doofer Name, ich weiß, bin schreibfaul).

    Wenn du nun zB schauen willst wer alles am selben Tag Geburtstag hat, kannst du das folgendermaßen machen:

    // vector<Geb> gebs; siehe anderes Beispiel
    
    for(int i = 0; i < gebs.size() - 1; ++i){
      for(int j = i+1; j < gebs.size(); ++j){
        if (i == j) continue; // nicht mit sich selbst vergleichen
        if (gebs[i].monat == gebs[j].monat){
          if (gebs[i].tag == gebs[j].tag){
            cout << gebs[i].name << " und " << gebs[j].name << " haben am selben Tag Geburstag!" << endl;
          }else{
            cout << gebs[i].name << " und " << gebs[j].name << " haben im selben Monat Geburtstag!" << endl;
          }
        }
      }
    }
    

    Im Grunde vergleichst du jeden Eintrag mit allen anderen (aber immer nur den nachfolgenden in der Liste, sonst machst das ja doppelt).

    Einen vector erstellst du mit:

    vector< typ > name;
    // zB:
    vector< int > zahlen;
    // füllen mit:
    zahlen.push_back(10);
    // Zugriff:
    cout << zahlen[0] << /*oder*/ zahlen.at(0) << endl;
    


  • Was hast du denn in deiner txt stehen? Bei mir macht er nichts...auch mit dem neuen code. Wenn ich die Exe ausführe, passiert nichts. Aber das was du da machst, ist ja eigentlich genau das was ich suche...ich geb halt 20,4,08 ein und dann soll der mir z.B. sagen, dass da Lukas Geburtstag hat oder wer auch immer an dem eingegebenen Datum Geburtstag hat.
    Vielen Dank schonmal jetzt für die Antworten



  • zB:

    01.01.Uwe
    04.04.Klaus
    05.02.Peter
    02.01.Kevin
    

    Hinter getline(...) am besten noch ein if (file.fail()) break;

    EDIT:

    Wenn du noch das Jahr drin haben willst, musst du das Geb-Struct entsprechend erweitern und das Einlesen ebenso. delim dabei nicht vergessen. Damit wird halt ein beliebiges Trennzeichen eingelesen.



  • Auf jeden Fall musst Du in "C++" Vector nehmen, denn Array ergibt unsauberen und fehlertraechtigen Code in "C++"! 🤡



  • Vielen vielen Dank. Die Tipps und Programmteile haben mir sehr geholfen. Habs jetzt leicht anders gelöst, aber durch die Auszüge hab ich das alles erst verstanden. Und es funktioniert alles. Schönen Dank 🙂


Anmelden zum Antworten