CString in string umwandeln

llREAPERll

Grünschnabel
Brauche dringend hilfe. Ich muß wissen wie ich eine CString-Variable in eine string-variable umwandle.
Bsp: CString raucher in string rauch

Weiterhin habe ich ein Problem beim auslesen einer Datei.
Bsp:

int i=0;
char buffer[1000];
string file = "C:\\Projekt\\User\\"+ (daten.at(u)) +".dat";
const char* fileC = file.c_str();

ifstream pfad(fileC, ios::in);
while( ! pfad.eof() )
{
pfad.getline(buffer, 1000);
string *s = new string(buffer);
unsigned int start = 0;
unsigned int end = 0;
while( end != string::npos)
{
if(i==0)
{
end = s->find(',',start);
int len = end-start;
username = s->substr(start,len);
start = end+1;
i++;
}
if(i==1)
{
end = s->find(',',start);
int len = end-start;
vorname = s->substr(start,len);
start = end+1;
i++;
}


Die if-Anweisung wiederholt sich 26 mal bis ich alle Daten aus der Datei in die richtigen Variablen gespeichert habe. Mich würde interressieren ob es da nicht eine kürzere Schreibweise gibt in der ich die Daten in einen CString speichern kann und nicht in string-Variablen.
Ich hoffe Ihr könnt mir helfen

MfG
llREAPERll
 
1.
Code:
std::string a( "test1" );
CString b(  "test2"  );

// CString -> std::string
a = LPCTSTR( b ); 

// std::string -> CString
b = a.c_str();

2. Ich habe deinen Code nur kurz überflogen, aber warum newst du den String? Das ist unnötigt. Verwende lieber einen string auf dem Stack. So verursachst du nämlich nur Ressourcenlecks.
Ich hatte noch keine Zeit, deiner Frage auf den Grund zu gehen und werde es wohl nachher machen. Vielleicht könntest du mal eine besser lesbare formatierte Version deines Codes posten.
 

Anhänge

  • codetags.gif
    codetags.gif
    7,5 KB · Aufrufe: 415
Ich bearbeite derzeit ein Projekt in dem ich Daten in Dateien speichern und wieder auslesen muss und der farblich makierte Queltext ist das einzige was ich als Hilfe von meinem Dozenten bekommen habe, den Rest habe ich selbst dazu geschrieben.
Ich schreibe mal den ganzen Quelltext auf (hoffe es ist nicht übertrieben)
Gibt es eine bessere Möglichkeit Daten zu speichern und so wieder auszulesen das ich die Daten einzelnen Variablen zuweisen kann? Wie kann ich das ganze in MFC-Programmierung in Form von Dialogen umsetzen?
Ich muß halt irgendwie eine Personenverwaltung aufbauen.


Code:
void mitgliederEinlesen()
{
	cout<<"* Haben Sie bitte etwas geduld User-Daten werden eingelesen *"<<endl;

	string username, vorname, nachname, passwort, nationalitaet, familienstand, kinder, raucher, geschlecht, gesuchtesGeschlecht;
	string figur, augenfarbe, haarfarbe, frisur, erscheinung, tatoo, piercing, text;
	string ort, email;
	string groesseS, plzBereichS, tagS, monatS, jahrS;	

	vector<string>::size_type size = daten.size();
	for(int u=0; u<size; u++)
	{
		int i=0;

		char buffer[1000];
		string file = "C:\\Projekt\\User\\"+ (daten.at(u)) +".dat";
		const char* fileC = file.c_str();

		ifstream pfad(fileC, ios::in);
		while( ! pfad.eof() )
		{	
			pfad.getline(buffer, 1000);
			string *s = new string(buffer);
			unsigned int start = 0;
			unsigned int end = 0;
			while( end != string::npos)
			{
				if(i==0)
				{
					end = s->find(',',start);
					int len = end-start;
					username = s->substr(start,len);
					start = end+1;
					i++;
				}
  
			        if(i==1)
				{
					end = s->find(',',start);
					int len = end-start;
					vorname = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==2)
				{
					end = s->find(',',start);
					int len = end-start;
					nachname = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==3)
				{
					end = s->find(',',start);
					int len = end-start;
					passwort = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==4)
				{
					end = s->find(',',start);
					int len = end-start;
					tagS = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==5)
				{
					end = s->find(',',start);
					int len = end-start;
					monatS = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==6)
				{
					end = s->find(',',start);
					int len = end-start;
					jahrS = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==7)
				{
					end = s->find(',',start);
					int len = end-start;
					nationalitaet = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==8)
				{
					end = s->find(',',start);
					int len = end-start;
					familienstand = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==9)
				{
					end = s->find(',',start);
					int len = end-start;
					kinder = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==10)
				{
					end = s->find(',',start);
					int len = end-start;
					raucher = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==11)
				{
					end = s->find(',',start);
					int len = end-start;
					geschlecht = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==12)
				{
					end = s->find(',',start);
					int len = end-start;
					gesuchtesGeschlecht = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==13)
				{
					end = s->find(',',start);
					int len = end-start;
					groesseS = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==14)
				{
					end = s->find(',',start);
					int len = end-start;
					figur = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==15)
				{
					end = s->find(',',start);
					int len = end-start;
					augenfarbe = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==16)
				{
					end = s->find(',',start);
					int len = end-start;
					haarfarbe = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==17)
				{
					end = s->find(',',start);
					int len = end-start;
					frisur = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==18)
				{
					end = s->find(',',start);
					int len = end-start;
					erscheinung = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==19)
				{
					end = s->find(',',start);
					int len = end-start;
					tatoo = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==20)
				{
					end = s->find(',',start);
					int len = end-start;
					piercing = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==21)
				{
					end = s->find(',',start);
					int len = end-start;
					text = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==22)
				{
					end = s->find(',',start);
					int len = end-start;
					plzBereichS = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==23)
				{
					end = s->find(',',start);
					int len = end-start;
					ort = s->substr(start,len);
					start = end+1;
					i++;
				}
				if(i==24)
				{
					end = s->find(',',start);
					int len = end-start;
					email = s->substr(start,len);
					start = end+1;
					i++;
				}

				const char* groesseC = groesseS.c_str();
				const char* plzBereichC = plzBereichS.c_str();
				const char* tagC = tagS.c_str();
				const char* monatC = monatS.c_str();
				const char* jahrC = jahrS.c_str();
				int groesse = atoi(groesseC);
				int plzBereich = atoi(plzBereichC);
				int tag = atoi(tagC);
				int monat = atoi(monatC);
				int jahr = atoi(jahrC);
		
				Mailbox* mailbox = new Mailbox();
				Datum* datum = new Datum(tag,monat,jahr);
				Adresse* adresse = new Adresse(plzBereich,ort,email);
				Aussehen* aussehen = new Aussehen(groesse, figur, augenfarbe, haarfarbe, frisur, erscheinung,tatoo,piercing,text);
				Person* person = new Person(username, vorname,nachname,passwort,nationalitaet,familienstand,kinder,raucher,geschlecht,gesuchtesGeschlecht,aussehen,datum,adresse,mailbox);
				
				datum->alterBerechnen();
				
				mitglieder.insert(map<string,Person*>::value_type(username,person));
				break;
			}
			break;
		}
		pfad.close();				
	}
}




Ich hoffe du kannst mir behilflich sein.

MfG
llREAPERll
 
Hallo

Du kannst in der MFC auch die Klassen CFile, CStdFile oder CArchive nutzen!
Diese sind meiner Meinung nach etwas komfortabeler im Umgang als die fstream
Objekte!
Code:
CString Path = "c:\\deinPfad";
char lesetextUser[1000]="";
CFile ExDateiUser(Path,CFile::modeRead);	
ExDateiUser.Read(lesetextUser, 1000);	
 CString hilfUser = lesetextUser ;

Mehr findest du in der MSDN dazu!

sven
 
Nützlicher oder besser als std::string und std::iostream sind CString und CFile sicher nicht. Sie ersparen einem bestenfalls ein paar Konvertierungen, wenn man mit MFC arbeitet, da viele Controls zum Beispiel mit CString arbeiten.


Ich schreibe mal den ganzen Quelltext auf (hoffe es ist nicht übertrieben)
Nein. Es fehlen leider sogar ein paar Sachen, zum Beispiel die Definition von Person usw.

Code:
  string *s = new string(buffer);
Für jede Zeile der Datei allozierst du einen string, den du nicht wieder freigibst. Du musst am Ende des Geltungsbereichs des Zeigers wieder freigeben, auf was er zeigt. Beispiel:
Code:
...
mitglieder.insert(map<string,Person*>::value_type(username,person));
delete s;
...
Übrigens darfst du auf keinen Fall vergessen, bei Einträge in mitglieder, die du nicht mehr brauchst, den Inhalt vorher freizugeben, sonst hast du auch da Speicherlecks. Das triffst natürlich für alles zu, was du newst.

Das zuerst erwähnte new kansst du umgehen, indem du den string s[] auf dem Stack erzeugst. Aufräumen ist dann unnötig. Nur musst du dann die Syntax an ein paar Stellen anpassen. ( Aus -> wird .)
Code:
string s( buffer );
...
end = s.find(',',start);

Zum Umgehen mit Dialogen und so weiter gibt es ziemlich viele Beispiele. Eventuell wäre das hier ganz interessant. Wenn du nicht weiterkommst, kann ich dir ein einfaches Dialogprojekt basteln. Es ist aber recht einfach: Erzeuge ein neues Projekt, und zwar eine MFC-Anwendung. Du kannst dann wählen, ob sie z.B. SDI, MDI oder dialogbasiert werden soll. Wähle dialogbasiert. Du erhältst dann ein Projket mit einem nahezu leeren Dialog, in den du bei geöffnetem Ressourceneditor testweise mal ein paar Editboxen usw. einsetzten kannst. Wenn ein Control gewählt ist, drücke Ctrl-W, um den Class-Wizard zu öffnen. Er hilft einem dabei, die eingefügten Windows-Controls in MFC-Controlklassen zu "wrappen" (z.B. CEdit). Das macht dann denn Umgang mit den Controls relativ einfach.
 
Nachtrag

Um deine riesige if()-Konstruktion zu stutzen, gibt es mehrere Möglichkeiten. Ich will dir mal zeigen, wie man es mit enum und einem string-Array machen könnte. Ich habe das BEispiel weder kompiliert noch getestet und hoffe, dass ich mich nicht all zu oft verschrieben habe. (Übrigens scheint deine innere Schleife nicht zu funktionieren, so wie sie aussieht.)

Code:
const enum eintraege 
{ 
  eintraege_begin=0,
  
  username=0 , vorname, nachname, passwort, nationalitaet, familienstand, kinder, raucher, geschlecht, gesuchtesGeschlecht, figur, augenfarbe, haarfarbe, frisur, erscheinung, tatoo, piercing, text, ort, email, groesseS, plzBereichS, tagS, monatS, jahrS,  
  
  eintraege_end 
};

string daten[eintraege_end];

....

// in Schleife:


      while( end != string::npos)
      {
        if(i>=eintraege_end)
        {
          // alarm!
          break;
        }       
       
        end = s.find(',',start);
        int len = end-start;
        daten[ i ] = s.substr(start,len); // <- das ersetzt alle if()
        start = end+1;
        i++;
      }

      int groesse     = atoi( daten[ groesseS     ].c_str());
      int plzBereich  = atoi( daten[ plzBereichS  ].c_str());
      int tag         = atoi( daten[ tagS         ].c_str());
      int monat       = atoi( daten[ monatS       ].c_str());
      int jahr        = atoi( daten[ jahrS        ].c_str());
    
      ...
      
      Person* person = new Person( daten[ username ],
                                   daten[  vorname ],
                                   ... );
        
      ...  
        
      mitglieder.insert(map<string,Person*>::value_type( daten[username],person));

      ...
 
Ups
Code:
cout<<"* Haben Sie bitte etwas geduld User-Daten werden eingelesen *"<<endl;

hatte ich dann wohl übersehen! nächstemal schau ich besser noch mal genau nach!

sorry
 
Habt vielen Dank für eure hilfe.
Der Queltext wie ich ihn gepostet habe funktionierte als Konsolenanwendung 1a ich hatte allerdings Probleme es in eine Dialog-Anwendung umzusetzen aber mit eurer hilfe hab ich es nun geschafft.

DANKE
llREAPERll
 

Neue Beiträge

Zurück