Problem mit String *dringend*



  • Hallo erstmal!
    Also ich machs kurz. Ich muss innerhalb der nächsten 2 Stunden mit nem Projekt fertig werden, bin ziemlicher Anfänger in C++ , Mein Problem ist folgendes: Irgendwie wird ein char nicht zu nem String kopiert, nachdem ich 2 Switch/case Bedinungen in jeweils 1 Modul untergebracht habe.
    Das Programm funktioniert soweit einwandfrei, nur eben das bei Ausgabe des Cpus nur ein a angezeigt wird bzw wenn ich in den Modulen Deklarierungen ändere wirre Zeichen (char) . Die Prozessornamen kann man aus einer Liste auswählen und jenachdem was man wählt wird eben der name einem char zugewiesen und dann via strcpy kopiert - funzt auch einwandfrei, solange ich es ohne Module mache. Nur eben jetzt wo ich modularisiert habe gibts die Probleme, mir fehlt einfach irgendwo ne deklaration denke ich mal.. Würde sich einer evtl mal kurz den Code anschauen? Ich hoffe ma es is nich allzuviel.. also interessant sind die Module Intel und Amd und das Modul Schreiben. Irgendwo da stimmt was nicht. Ich kriegs einfach nicht hin.
    void Intel und void Amd

    Ach ja und bitte seht von Sachen wie: was is das fürn komischer Programmierstil etc ab, so lernen wirs halt und bei dem Programm war ich zusätzlich ziemlich in eile 😕

    Bei CPU wird einfach nur ein a ausgegeben.

    #include <iostream>
    	#include <fstream>
    	#include <string>
       #include <cstring.h>
    	#include <iomanip>
    	#include <stdlib.h> //  exit()
       #include <conio.h>
       #include <dos.h>
    
       void farben(int farbe)
    {
       SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), farbe);
    }
    
       void Menue(string& Dname, fstream& f);
    	struct TProz
    	{
    	  char Nummer[40];
    	  char Name[100];
    	  char Cpu[100];
         char Ram[40];
         char Kunden[30];
         char Hd[40];
    
    	};
    	TProz Prozsatz;
    
    	void OeffneDatei(const string Dname, fstream& f, const ios::open_mode m)
    	{
    	  f.open(Dname.c_str(),m | ios::binary);
    	  if (!f)
    	  {
    	    cout << "Programmabbruch: Fehler beim Oeffnen der Datei " << Dname;
           sleep(2);
    	    exit(1);
    	  }
    	}
    
    	void OeffneDateiNeu(string& Dname, fstream& f)
    	{
    	  char taste;
    
    	  cout << "Name der neuen Datei eingeben(z.B. Server.dat) oder Name der aelteren"<<endl <<"zum aendern/erweitern: ";
         farben(11);
    	  getline(cin,Dname,'\n'); farben(15);  cout<<endl;
         cout<<"Ueberpruefe Datei, bitte warten";
         sleep(1); cout<<".";
         sleep(1); cout<<".";
         cout<<endl;
    	  f.open(Dname.c_str(),ios::in|ios::binary);
    	  if (f)
    	  {
    	    f.close();
    	    do
    	    {
    	     cout << "Achtung, Datei"; farben(12); cout<<" existiert schon ";farben(15); cout<<"- ueberschreiben (j/n)? "; ;cin >> taste;
    	     taste = toupper(taste);
    	    } while (taste!='J' && taste!='N');
    	    cin.ignore();
    	    if (taste=='J')
    	    {
    	      OeffneDatei(Dname,f,ios::out|ios::trunc);
    	      f.close();
    	    }
    	  }
    	  else f.close();
    	}
    
    	void SchliesseDatei(const string& Dname,fstream& f)
    	{
    	  f.close();
    	  farben(11);cout <<endl << "Datei " << Dname << " geschlossen." << endl;farben(15);
    	}
    
    	void SatzAnzeigen(TProz k)
    	{
    	  //cout.precision(3);
    	  cout << "Rechenzentrum:  			 " << k.Nummer << endl;
    	  cout << "Servername:   				 " << k.Name << endl;
    	  cout << "cpu:                      " << k.Cpu << endl;
         cout << "Festplatte:               " << k.Hd <<endl;
         cout << "Ram:                      " << k.Ram << endl;
         cout << "Kunden Maximal:           " << k.Kunden <<endl;
    	}
    
       void Intel(TProz k)
       { char iproz;
         string CpuStr;
         char Cpu[100];
                   cout<<"  Intel Prozessorenliste: " <<endl;
           			cout<<"  1: Prestionia 2666 Mhz" <<endl;
                   cout<<"  2: Prestionia 2800 Mhz" <<endl;
                   cout<<"  3: Prestionia 3066 Mhz" <<endl;
                   cout<<"  4: Gallatin   2666 Mhz" <<endl;
                   cout<<"  5: Gallatin   3200 Mhz" <<endl;
                   cout<<"  6: Nocona     2666 Mhz" <<endl;
                   cout<<"  7: Nocona     3200 Mhz" <<endl;
                   cout<<" Bitte Prozessor auswaehlen (1-8): "; cin>>iproz;
                   switch(iproz)
                   {
                   case '1':  CpuStr= "Prestionia 2666 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '2':  CpuStr= "Prestionia 2800 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '3':  CpuStr= "Prestionia 3066 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '4':  CpuStr= "Gallatin   2666 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '5':  CpuStr= "Gallatin   3200 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '6':  CpuStr= "Nocona     2666 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '7':  CpuStr= "Nocona     3200 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                    case '8':  CpuStr= "Nocona     3400 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   default: exit(1);
           		   }
        }
    
       void Amd(TProz k)
       { char aproz;
         string CpuStr;
    
                   cout<<"  Amd Prozessorenliste: " <<endl;
           			cout<<"  1: Athlon  64 X2 4400+" <<endl;
                   cout<<"  2: Athlon  64 X2 4600+" <<endl;
                   cout<<"  3: Athlon  64 X2 4800+" <<endl;
                   cout<<"  4: Athlon  64    3800+" <<endl;
                   cout<<"  5: Athlon  64    4000+" <<endl;
                   cout<<"  6: Opteron 250   2400 Mhz" <<endl;
                   cout<<"  7: Opteron 252   2600 MHz" <<endl;
                   cout<<"  8: Opteron 254:  2800 MHz" <<endl;
    					cout<<" Bitte Prozessor auswaehlen (1-8): "; cin>>aproz;
                   switch (aproz)
                   {
                   case '1':  CpuStr= "Athlon  64 X2 4400+";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '2':  CpuStr= "Athlon  64 X2 4600+";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '3':  CpuStr= "Athlon  64 X2 4800+";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '4':  CpuStr= "Athlon  64    3800+";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '5':  CpuStr= "Athlon  64    4000+";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '6':  CpuStr= "Opteron 250   2400 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   case '7':  CpuStr= "Opteron 252   2600 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                    case '8':  CpuStr= "Opteron 254  2800 Mhz";
                   strcpy(k.Cpu,CpuStr.substr(0,30).c_str());
                   break;
                   }
       }
    	void Schreiben(string Dname, fstream& f)
    	{
         char selection;
    	  TProz k;
    	  string NameStr;    //fuer gleich folgende Umwandlung von charfeldern in strings 
         string CpuStr;
         string NumStr;
         int Ram;
         int Kunden;
         int Hd;
         int firmauswahl;
         char iproz;
         char aproz;
         char Cpu[100];
    
    	  OeffneDatei(Dname,f,ios::out|ios::app);
    	  //while (true)
    
         //{
           do{
    	    farben(15);
    		 cout << "\nRechenzentrum: "; cin.ignore();
           getline(cin,NumStr,'\n');
      	    strcpy(k.Nummer,NumStr.substr(0,30).c_str());
    	    cout << "Name des Servers:       ";
    	    getline(cin,NameStr,'\n');
    	    strcpy(k.Name,NameStr.substr(0,30).c_str());
    	    cout << "Cpu auswaehlen";
           cout << "\n====================" << endl;
    	    cout << "1 Intel     " << endl;
           cout << "2 Amd       "<< endl;
    	    cout << "===================" << endl;
           cout << "Auswahl eingeben: "; cin>>firmauswahl;
    
           if(firmauswahl==1)
           {Intel(k);
    		 }
           else {Amd(k);}
           cout << "Festplatte(GB):       ";  cin>>k.Hd;
           cout << "Ram(MB):              "; cin>>k.Ram;
           cout << "Maximale Kundenanzahl "; cin>>k.Kunden;
    		 f.write((char*)&k,sizeof(k));
           farben(10); cout<<"Datensatz wurde gespeichert!"; farben(7);
           farben(15);cout<<"\n Weitere Datensaetze eingeben? (j/n): ";
           cin>>selection;
                 }
                while (selection == 'j' || selection == 'J');
    
               farben(15);cout<<"Gehe zurueck ins Hauptmenue, bitte warten ..\n";
               sleep(1);
               clrscr();
    
    	  f.close();
    	}
    
    	void Auflisten(const string& Dname, fstream& f)
    	{
    	  int SatzNr=1; //Anzeigenummer in Ausgabeliste
    	  TProz k;
    	  OeffneDatei(Dname,f,ios::in);
    	  SatzNr = 1;
    	  //cout << "\nSatznummer  Kundennummer  Name                   cpu" << endl; //SIehe drei Zeilen weiter unten ;D
    	  while (f.read((char*)&k,sizeof(k)))
    	  {
    	   /* //Das hier is bissl formatiert und so, aus Zeitgründen mach ich es simpler.
           cout << setw(6) << SatzNr++ << ":      "
    	         << setw(7) << k.Nummer << "      " << setw(19);
    	    cout.setf(ios::left,ios::adjustfield);
    	    cout << k.Name << "  " << setw(8);
    	    cout.setf(ios::right,ios::adjustfield);
    	    cout << k.Cpu <<"      " <<setw(9);
           cout.setf(ios::right,ios::adjustfield);
           cout<<endl<<setw(20);
           cout<<"\t--------------------------------"; cout<<endl;
           cout<<"            Ram        Kunden";
           cout<<endl <<"      ";
           cout << k.Ram <<"      " <<setw(10);
           cout.setf(ios::left,ios::adjustfield);
           cout << k.Kunden <<"      " <<setw(11);
           cout.setf(ios::right,ios::adjustfield); */
           cout<<endl;farben(15);
           cout<<"Satznr:      "; farben(12); cout<<SatzNr++; farben(15); cout<<endl <<endl;
           cout<<"Rechenzentrum    "; farben(15); cout<<k.Nummer; farben(15); cout<<endl;
           cout<<"Servername:      "; farben(15); cout<<k.Name; farben(15); cout<<endl;
           cout<<"Cpu:             "; farben(15); cout<<k.Cpu; farben(15); cout<<endl;
           cout<<"Festplatte:      "; farben(15); cout<<k.Hd; farben(15); cout<<endl;
           cout<<"Ram(MB):         "; farben(15); cout<<k.Ram; farben(15); cout<<endl;
           cout<<"Maximale Kunden: "; farben(15); cout<<k.Kunden; farben(15); cout<<endl;;
           cout<<"------------------------------" <<endl;
    	  }
         cout<<endl;farben(15); cout<<"Ende der Liste !" <<endl<<endl;
    	  f.close();
    	}
    
    	void Suchen(const string& Dname, fstream& f)
    	{ char swahl;
    	  string NameSuch;
         string NumSuch;
         string CpuSuch;
         string RamSuch;
         string Kundensuch;
    	  bool fund = false;
    	  TProz k;
    
    	 /* cout << "Nach was moechten sie suchen?" <<endl;
         cout << "\n====================" << endl;
    	    cout << "1  Rechenzentrum   " << endl;
    	    cout << "2  Servername" << endl;
    	    cout << "3  cpu " << endl;
    	    cout << "4   Ram " << endl;
    	    cout << "5   Kunden " << endl;
    	    cout << "===================" << endl;
    	    farben(192);cout << "Bitte waehlen:"; farben(7); cout<<" "; farben(15); swahl = cin.get();*/
    
           	  OeffneDatei(Dname,f,ios::in);
    	  cout << "Servername als Suchbegriff: ";
    	  getline(cin,NameSuch,'\n'); cout<<endl;
    	  while (!fund && f.read((char*)&k,sizeof(k)))
    	    if (NameSuch==k.Name) fund=true;
    	  if (fund)
    	  { farben(10);cout<<"Datensatz gefunden!" <<endl;farben(15);
    	    SatzAnzeigen(k);
    	  }
    	  else
    	  {
    	    cout << "Satz "; farben(13); cout<< NameSuch << " nicht vorhanden." << endl;
    	    NameSuch = "0";
    	  }
    	  f.close();
    	}
    
    	void Aendern(const string& Dname, fstream& f)
    	{
    	  int SatzNr=1;
    	  TProz k;
    	  string NameStr;
         string RamStr;
         string KundenStr;
         string CpuStr;
    
    	  OeffneDatei(Dname,f,ios::in|ios::out);
    	  cout << "Satznummer (0,1,2,...): "; cin >> SatzNr;
    	  if (!f.seekp(SatzNr*sizeof(k)))
    	  {
    	    cout << "Datensatz Nr." << SatzNr << "existiert nicht." << endl;
    	    return;
    	  }
    	  f.read((char*)&k,sizeof(k));
    	  cout.precision(3);
         cout << "Rechenzentrum " << k.Nummer << " - neu: ";
         cin >> k.Nummer; cin.ignore();
         cout << "Name des Servers bisher: " << k.Name << " - neu: ";
         getline(cin,NameStr,'\n');
         strcpy(k.Name,NameStr.substr(0,19).c_str());
    	  cout << "Cpu bisher:         " << k.Cpu << " - neu: ";
          getline(cin,CpuStr,'\n');
         strcpy(k.Cpu,CpuStr.substr(0,19).c_str());
    	  cout << "Ram bisher :  " << k.Ram << " - neu: ";
    	  getline(cin,RamStr,'\n');
         strcpy(k.Ram,RamStr.substr(0,30).c_str());
    	  cout << "Kunden bisher: " << k.Kunden <<   " - neu: ";
    	  getline(cin,KundenStr,'\n');
    	  strcpy(k.Kunden,KundenStr.substr(0,30).c_str());
    	  f.seekp(SatzNr*sizeof(k));
    	  if (f.write((char*)&k,sizeof(k)))
    	    {cout <<endl<< "Satz wurde geaendert." << endl;
           farben(11);cout << "Neuer Satz:" <<endl<<endl;farben(15);
    
           SatzAnzeigen(k);
           }
    	  else
    	    cout << "Satz konnte nicht geändert werden." << endl;
    	  f.close();
    	}
    
    	void Menue(string& Dname, fstream& f)
    	{ bool wdh;
    	  char Wahl;
         farben(15);
          do
    	    {
    	    cout << "\nZur Menueanzeige Return druecken! "; cin.get(); clrscr();
           farben(15);
    	    cout << "\n======================================================" << endl;
    	    cout << "Datei in Bearbeitung: "; farben(12);cout<< Dname << endl<<endl; farben(14);
    	    cout << "0   Ende:          Programm beenden" << endl;
    	    cout << "1   Schreiben:     Neue Datensaetze an Datei anhaengen" << endl;
    	    cout << "2   Auflisten:     Alle Datensaetze seriell lesen" << endl;
    	    cout << "3   Suchen:        Datensatz suchen und lesen" << endl;
    	    cout << "4   Aendern:       Bestimmten Datensatz aendern" << endl;
    	    cout << "5   Neu:           Neue Datei bearbeiten" << endl;
           farben(15);
    	    cout << "=======================================================" << endl;
    	    farben(192);cout << "Bitte waehlen:"; farben(7); cout<<" "; farben(15); Wahl = cin.get();
    	    cin.ignore();
           wdh=true;
    	    switch (Wahl)
    	    {
    	      case '1': Schreiben(Dname,f); break;
    	      case '2': Auflisten(Dname,f); break;
    	      case '3': Suchen(Dname,f); break;
    	      case '4': Aendern(Dname,f); break;
    	      case '5': SchliesseDatei(Dname,f); OeffneDateiNeu(Dname,f); break;
             default: (wdh=false); 					//farben(12); cout<<"Programmende"; sleep(1); exit(1);
    	    }
    	  }   while (wdh==true);
    
      	}
    
    	void main()
    	{ farben(10);cout<<"\t\t Serververwaltung 0.2 beta (c) C" <<endl<<endl;
         farben(15); cout<< "Bitte geben sie "; farben(12); cout<<"zuerst"; farben(15); cout<<" einen Dateinamen ein, danach erscheint das Hauptmenue!" <<endl<<endl;
    	  fstream KundenDat;
    	  string Dateiname;
         farben(15);
         OeffneDateiNeu(Dateiname,KundenDat);
    	  Menue(Dateiname,KundenDat);
    	  farben(12); cout << "Programmende" << endl;
    	  getch();
    	}
    


  • äh, fang das Programm doch mal von vorne an. Schreib immer einen kleinen Teil und teste ob dieser funktioniert. Wenn der Teil funktioniert, dann mach mit dem nächsten Teil weiter. Einen riesen Klotz zu schreiben und dann da versuchen die Fehler zu finden ist doch sinnlos (ganz zu schweigen davon, das wohl kaum jemand in einem Forum einen derart langen Code für dich debuggen wird).

    Ach ja und versuch bitte konkrete Fragen zu stellen und bei Problemen eine konkrete Fehlerbeschreibung zu geben...



  • selber debuggen



  • oder schrieb:

    selber debuggen

    !

    oder kreis den fehler weit genug ein, dass du nurnoch ein paar zeilen posten musst.



  • alc schrieb:

    also interessant sind die Module Intel und Amd

    Call (them) By Reference !
    🙂


Anmelden zum Antworten