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



  • Tach alle zusammen

    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. Nur kan ich eine vorher divinierte Variable vom diesem Typ nicht an einen Operator wie z.B.

    cout
    

    schicken.

    Ich würde gerne Wissen warum das so ist und wie das geht.



  • Weil der Standard kein __int64 kennt, das ist eine compilerspezifische Erweiterung. Da die iostream-Libraries allerdings auf dem Standard basieren ist für __int64 keine Überladung vorhanden.

    Du könntest aber zB selbst eine Überladung für __int64 schreiben.

    BTW: Ich finde __int64 ist kein brauchbarer Typ um Handynummern zu speichern, mir scheint da ein String geeigneter.

    MfG SideWinder

    PS: Die Anzahl der Fragezeichen im Titel solltest du drastisch reduzieren.



  • 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.


Anmelden zum Antworten