__int64 an Operator schicken??????????



  • Hallo

    Hightaker schrieb:

    Ich will in meinem Programm Händynummern speichern und hab mir überlegt das die beste Variable dafür

    __int64
    

    sein muss , weil sie die längsten Zahlen speichern kan.

    Wie lang sollen den die Handynummern sein, dass es kein einfaches

    unsigned int
    

    tut?

    chrische



  • Gibt ne tolle Regel: Nummern mit denen du nicht rechnest (Telefon, PLZ,...) immer als string speichern.

    hab sogar mal den Grund gewusst, muss aber zu meiner Schande gestehen, dass ich es vergessen hab 😞



  • Du kannst im besten Fall Speicher sparen, nicht vorhergesehene Anomalien bei der User-Eingabe ohne Probleme meistern, Strings lassen sich leicht mit Regular Expressions prüfen, Strings haben führende Nullen wenn gewünscht, etc. etc.

    @chrische5: Meine würde nicht in einen unsigned int passen 🙂

    MfG SideWinder



  • Hallo

    SideWinder schrieb:

    @chrische5: Meine würde nicht in einen unsigned int passen 🙂

    Ja war meien Schuld. Ich habe nicht zu Ende gedacht und mir überlegt, dass es einige Handynummern gibt, die da nicht reinpassen.

    chrische



  • Nimm dafür lieber einen String, da eine Telefonnr. kein "Wert" ist. Sie ist einfach nur eine ananderreihung von Ziffern, hätten genauso gut Buchstaben sein können. int u.a. würde ich nur für "Werte" nehmen, mit denen man rechnen kann oder will. Außerdem hast du bei Zahlentypen das Problem, das du z.B. eine Telefonnr. nicht separieren kannst: +49-1234-567890 geht unmöglich!



  • Ok ich muss gestehen da hast du rech , dumm von mir das ich da nicht drauf gekommen bin. Doch jetzt binn ich auf ein weiteres Problem in meinem Programm gestoßen. Das Programm - was mal eine Addressen Datenbank werden soll - ist noch im "Anfangsstadium" ,und ich weis das macht inhaltlich noch nicht fiel Sinn.Beim einlesen der Handynummer wartet das Programm nicht auf die eingabe sondern geht gleich aus.Ich kapier aber nich warum.

    #include <string>
    #include <iostream>
    #include <fstream>
    #include <windows.h>
    using namespace std;
    
    class eintrag
    {
    public:
    	string name;
    	string nachna;
    	char alter;
        string telefon;
    
    public:
    int neu()
    {
    	ofstream dat_aus;                                           
    	string dateiname;
    
    	cout <<"Geben sie den Dateinamen und Pfad ein:";
    	cin >> dateiname;
    	cout << endl;
    
    	dat_aus.open(dateiname.c_str(), ios_base::out);
    	cout << "Eintrag hinzufügen" << endl;
    
    	cout <<"Name:";
    	cin >> name; 
    
    	cout <<"Nachname:"; 
    	cin >> nachna;
    
    	cout <<"Alter:"; 
    	cin >> alter;
    
    	cout <<"Telefon: "; 
    	cin >> telefon;
    
    	dat_aus << name    <<" "
    	        << nachna  <<" "
    	        << alter   <<" "
    	        << telefon << endl;
    
    	dat_aus.close();
    	return 0;
    }
    
    int lesen()
    {
        ifstream dat_ein;
    	string dateiname;
    
    	cout <<"Geben sie den Dateinamen und Pfad ein:";
    	cin >> dateiname;
    	cout << endl;
    
    	dat_ein.open(dateiname.c_str(), ios_base::in);
        char eing;
        while (!dat_ein.eof())
    	{
    	  dat_ein.get(eing);
    	  cout << eing ;
    
    	}
    	  dat_ein.close();
    	Sleep (10000);
    	return 0;
    }
    };
    
    int main()
    {
        string sw  , hallo ;
    	eintrag ein1;
    
        while (sw != "/exit")  
    	{
    	 cout <<"Main Menue"<<endl ; 
    	 cout <<"\"\\n\" = Neuer Eintrag ,\"\\l\" = Lesen , \"\\exit\" = Beenden) " << endl;      
    	 cin >> sw;
    
    	  if (sw == "\\n")
    	  {
    	   ein1.neu();
    	  }
            else if (sw == "\\l")
    		{ein1.lesen();
    		}
    	  else 
    	  {cout << "Programm wird beendet!" << endl;
    	  Sleep (1000); 
    	  } 
    
    	}
    return 0;
    }
    

  • Mod

    User--- schrieb:

    Gibt ne tolle Regel: Nummern mit denen du nicht rechnest (Telefon, PLZ,...) immer als string speichern.

    hab sogar mal den Grund gewusst, muss aber zu meiner Schande gestehen, dass ich es vergessen hab 😞

    führende nullen ? 😉



  • 💡 💡 💡 👍



  • 😃 👍



  • Hightaker schrieb:

    Ok ich muss gestehen da hast du rech , dumm von mir das ich da nicht drauf gekommen bin. Doch jetzt binn ich auf ein weiteres Problem in meinem Programm gestoßen. Das Programm - was mal eine Addressen Datenbank werden soll - ist noch im "Anfangsstadium" ,und ich weis das macht inhaltlich noch nicht fiel Sinn.Beim einlesen der Handynummer wartet das Programm nicht auf die eingabe sondern geht gleich aus.Ich kapier aber nich warum.

    cin.ignore() wäre eine gute Idee - nach dem Einlesen des Alters (da ist übrigens int oder short günstiger als char) stehen noch Zeichen im Eingabepuffer, die bei der nächsten Eingabe weitergegeben werden.



  • Danke für den Tip
    Mir ist auch schon aufgefallen das wen ich z.B. als Namen "Steffan" ,Nachnamen "Rettberg" und als Alter "15" eingegeben hab stand in der TXT-Datei nachher :

    Steffan Rettber 1 5
    

    also ein Lehrzeichen zwischen der 1 und der 5 aber woran ligt das genau?
    Das passiert doch schließlich auch nicht wen ich die Daten stat in einer Datei in Variablen speicher.



  • du hast 'Alter' als char definiert - da passt nur ein einzelnes Zeichen rein. D.h. beim Einlesen wurde die '1' in Alter und die '5' im nächsten Schritt als Telefonnummer gespeichert.

    (Tipp von mir: verwende kein char für Zahlen-Eingaben, nimm dafür lieber einen "richtigen" Integer-Typ (z.B. short) - die Eingaberoutinen für char arbeiten anders als ihre short/int Entsprechung)



  • Vergiss short, das braucht man nie! ⚠



  • Ok danke kapiert 🙂
    Noch eine Frage:
    Wen ich mehrere Einträge in einer TXT-Datei speichern will brauche ich ja eine suchfunktion um die Infos für eine Person zu finden , wie setz ich das um?



  • Zeilenweise einlesen und aufteilen in dein struct, dann alles in einen vector<eintrag> packen und std::find (oder std::find_if) drüberjagen.

    Kenner der C++ Szene schrieb:

    Vergiss short, das braucht man nie! ⚠

    Na wenn du das sagst 🕶



  • Kanst du mir bitte mal ein Beispiel schreiben? Ich bin noch Anfänger. 😃



  • vector<eintrag> Werte;
    
    //einlesen:
    ifstream fin("Daten.txt")
    while(fin)
    {
      eintrag wert;
      fin>>wert.name>>wert.nachna>>wert.alter>>wert.telefon;
      if(fin) Werte.push_back(wert);
    }
    
    //suchen:
    class finde_name : public unary_function<bool,eintrag>
    {
    public:
      finde_name(const string& vn):m_vn(vn){}
      bool operator()(const eintrag& e)
      {return e.name==m_vn;}
    private:
      string m_vn;
    };
    
    vector<eintrag>::iterator pos=find_if(Werte.begin(),Werte.end(),finde_name("Hightaker"));
    if(pos!=Werte.end())
      cout<<"gefunden:"<<pos->name<<" "<<pos->nachna<<endl;
    else
      cout<<"nicht gefunden."<<endl;
    


  • Wie und Wo muss ich das einfügen? ich kriegs nicht hin ,bin wohl zu dumm.



  • Die Vergleichsklasse (finde_name) wird global deklariert, so daß deine Funktionen sie wiederfinden. Die übrigen Schnipselchen kommen entweder in die main() oder (besser) in eine eigene Funktion, die deine Daten durchsuchen soll (nach dem Einlesen stehen alle Datensätze aus deiner Datei in dem Vektor 'Werte' - find_if arbeitet diesen Vektor durch und liefert den ersten Datensatz, für den finde_name::operator() true zurückliefert (oder Werte.end(), wenn es keinen gibt)).

    PS: Wenn du nach anderen Kriterien suchen willst, benötigst du dafür eigene Vergleichsklassen wie finde_nachname oder finde_alter, die analog zu finde_name aufgebaut werden sollten.



  • 😕
    Ich hab meinen Quelltext noch ein bischen verändert und alles so gemacht wie du gesagt hast aber es geht trotzdem nich !!!

    #include <string>
    #include <iostream>
    #include <fstream>
    #include <windows.h>
    using namespace std;
    string dateiname = "MDB.TXT";
    
    class eintrag
    {
    public:
    	string name;
    	string nachna;
    	short alter;
        string tele;
    
    int neu()
    {
    	ofstream dat_aus;                                           
    
        dat_aus.open(dateiname.c_str(), ios_base::out | ios_base::app);
    	cout << "Eintrag hinzufuegen" << endl;
    
    	cout <<"Name:";
    	cin >> name; 
    
    	cout <<"Nachname:"; 
    	cin >> nachna;
    
    	cout <<"Alter:"; 
    	cin >> alter;
    
    	cout <<"Telefon:"; 
    	cin >> tele;
    
    	dat_aus << name    <<" "
    	        << nachna  <<" "
    	        << alter   <<" "
    	        << tele    << endl;
    
    	dat_aus.close();
    	cout << "\nEintrag gespeichert!\n\n\n" <<endl;
    	return 0;
    }
    
    int lesen()
    {
        ifstream dat_ein;
    
        eintrag eintrag2 ; 
    
    	dat_ein.open(dateiname.c_str(), ios_base::in);
    
        dat_ein >> eintrag2.name >> eintrag2.nachna >> eintrag2.alter >> eintrag2.tele;
    
    	cout <<"Name:"<< eintrag2.name   <<endl;
    	cout <<"Nachname:"<< eintrag2.nachna <<endl;
    	cout <<"Alter:"<< eintrag2.alter  << endl;	
    	cout <<"Telefonnummer:"<< eintrag2.tele   << endl;
    	dat_ein.close();
    	fflush(stdin);
    	getchar();
        return 0;
    }
    };
    
    class finde_name   : public unary_function <bool,eintrag> 
    { 
    public: 
      finde_name(const string& vn):m_vn(vn){} 
      bool operator()(const eintrag& e) 
      {return e.name==m_vn;} 
    private: 
      string m_vn; 
    }; 
    
    int main()
    {
        string sw  , hallo ;
    	eintrag ein1;
    
        while (sw != "/exit")  
    	{
    	 cout <<"Main Menue"<<endl ; 
    	 cout <<"Verwendete Datenbankdatei:"<< dateiname << endl;   
    	 cout <<"\"\\n\" = Neuer Eintrag ,\"\\l\" = Lesen , \"\\exit\" = Beenden) " << endl;      
    	 cin >> sw;
    
    	  if (sw == "\\n")
    	  {
    	   ein1.neu();
    	  }
            else if (sw == "\\l")
    		{void finde_name();
    
    		vector<eintrag>::iterator pos=find_if(Werte.begin(),Werte.end(),finde_name("Hightaker")); 
            if(pos!=Werte.end()) 
            cout<<"gefunden:"<<pos->name<<" "<<pos->nachna<<endl; 
            else 
            cout<<"nicht gefunden."<<endl; 
    
    		 while(fin) 
    		 { 
             eintrag wert; 
             fin>>wert.name>>wert.nachna>>wert.alter>>wert.telefon; 
             if(fin) Werte.push_back(wert); 
    		 } 
    
    		//ein1.lesen();
    		}
    	  else 
    	  {cout << "Programm wird beendet!" << endl;
    	  Sleep (1000); 
    	  } 
    
    	}
    return 0;
    }
    

Anmelden zum Antworten