suchen einer bestimmten zeichenkette



  • hi an alle,
    ich bin neu hier und hoffe das ihr mir helfen könnt.
    ich möchte daten aus dem ad auslesen und diese in eine txt datei speichern(geht).
    aus dieser datei will ich name und telefonnummer auslesen, diese nummer soll dann statt führende +(49) eine 00 haben. Diese daten sollen dann in einer anderen datei gespeichert werden.....hier mein code....ich bekomme es nicht hin die tel. und den namen auszulesen und habe auch keine idee wie. bitte um hilfe!

    //---------------------------------------------------------------------------
    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <string.h>
    #include <fstream>
    using namespace std;
    
    //---------------------------------------------------------------------------
    
    int main(int argc, char* argv[])
    {
    char filename[128];
    fstream file;
    fstream ofile;
    char zeile[1024];
    char zeichen;
    zeichen = '+';
    int i=0;
    char string1[127];
    strcpy(string1, "+");
    strcat(string1, "(");
    strcat(string1, "4");
    strcat(string1, "9");
    strcat(string1, ")");
    
    system ("csvde -f test.txt -d ou=test,dc=martin,dc=test -r objectclass=user");
    cout << "\n";
    system ("pause");
    
    cout << "Dateinamen eingeben: " << flush;
    cin.getline(filename, 127);
    
    file.open(filename, ios::in);
    
    	if (file.good())
    	{
    	file.seekg(0L, ios::beg);
    
    		while (! file.eof())
    		{
    			file.getline(zeile, 1024);
    			cout << zeile << endl;
    		}
    
    		std::string strZeile;
    		std::fstream file("test.txt");
    
    		while(std::getline(file, strZeile, zeichen))
    		{
    			std::fstream file("test.txt");
    			i++;
    			cout << i;
    
    				if (i>1)
    				{
    					ofile.open("bla.txt",ios::out);
    					ofile.seekp(0,ios_base::end);
    					ofile << string1;
    					cout << ofile.tellg();
    					ofile.close();
    				}
    		}
    
    		file.close();
    	}
    
    	else
        {
    		cout << "Datei nicht gefunden." << endl;
    	}
    
    system("pause");
    	return 0;
    
    }
    

    achso bitte für einen c++ anfänger erklären...
    Danke schon mal an alle



  • Fehlermeldung und C++-Codetags bitte 😃



  • naja so wie es jetzt da steht geht es soweit das es mir ein zeichen und zwar plus in die datei schreibt. aber soll mir die tel. ab + in die datei schreiben....



  • Du hast erst alles eingelesen und ausgegeben - danach macht die zweite while()-Schleife gar nichts mehr (das eofbit und failbit sind noch als Nachwirkungen der ersten Schleife gesetzt und außerdem steht dein Lesezeiger noch am Dateiende).



  • naja aber ich dachte mir das so das die 2. schleife solange läuft bis alle zeichen gefunden wurden....wie gesagt totaler anfänger....aber wie soll ich nun filter ich habe keine ahnung wie ich das machen soll...also war auch nur eine idee....



  • Wie gesagt - nach der ersten Schleife stehst du am Dateiende - jetzt könntest du mit clear() die Fehlerflags zurücksetzen und mit seekg() zurückspringen auf den Anfang. Aber der bessere Ansatz ist es wohl, IN der ersten Schleife die jeweiligen Eingabezeilen auszuwerten und zu verarbeiten.



  • ok erst mal vielen dank ich werde mich zuhause dann mal hinsetzen muss erst mal los..hast du vll einb bsp code für mich an den ich mich halten kann?



  • ich habe mal ne neue/alte frage...wie kann ich dem sagen das er nur von + bis zu einem komma die zeichen kopieren soll?



  • Du suchst dir mit find() die Startposition und Endposition des gewünschten Teils und schneidest den Abschnitt dazwischen mit substr() heraus:

    size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
    string teil = strZeile.substr(start,ende-start);
    

    (eventuell mußt du ein Zeichen mehr oder weniger rausschneiden)



  • jo noch mal vielen dank für die hilfe..wird sicher net die letzte frage sein...;)



  • ich glaub ich und c++ werden nie grosse freunde....jetzt bekomme ich diese fehlermeldung: Abnormal program termination ich habe den code so geschrieben nur noch eine while schleife...

    file.open(filename, ios::in);
    
    	if (file.good())
    	{
    	file.seekg(0L, ios::beg);
    		std::string strZeile;
    		while (! file.eof())
    		{
    			file.getline(zeile, 1024);
    			size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
    			string teil = strZeile.substr(start,ende-start);
    		}
    	 }
    
    	else
    	{
    		cout << "Datei nicht gefunden." << endl;
    	}
    

    ich bitte nochmal um hilfe..... 😞



  • Lass doch mal die char-Arrays außen vor und arbeite nur mit std::string's - das erleichtert die Arbeit enorm:

    if (file.good())
    {
        //file.seekg(0L, ios::beg);//das ist überflüssig
        std::string strZeile;
        while (getline(file,strZeile))
        {
            size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
            if(start==string::npos) continue;//kein '+' im Text gefunden
            string teil = strZeile.substr(start,ende-start);
            //und hier solltest du mit 'teil' weiterarbeiten
        }
    }
    


  • ok vielen dank es geht erst mal alles soweit....ich hoffe meine letzte frage..wie kann ich dem sagen das er nur den ersten gefunden namen nehmen soll denn der kommt immer zweimal vor bsp:
    ich will martin alter und markus walther aber in der datei sieht das so aus...
    "CN=martin alter,OU=test,DC=martin,DC=test",user,martin alter,alter,martin,"CN=martin alter,usw...
    "CN=markus walther,OU=untertest,OU=test,DC=martin,DC=test",user,markus, walther,walther,markus,"CN=markus walther,usw... also kommt jeder name 2 mal vor will ihn aber nur einmal haben....

    size_t start1 = strZeile.find('CN='),ende1 = strZeile.find(',',start1);
    		if(start1==string::npos) continue;
    		string teil1 (strZeile.substr(start1,ende1-start1));
    	ofile.open("bla.txt",ios::out|ios::ate);
    	ofile << teil1.insert(0,teil1);
    	ofile.close();
    


  • Erstmal: Wenn du nach Zeichenketten suchen willst, solltest du die in " einschließen.

    Zweitens: Wenn du mehrfache Vorkommen der Namen ausfiltern willst, mußt du zuerst mal erkennen, daß der Name schon kam - und da wäre es ein guter Ansatz, die Namen in eine set/map zu packen und vor der Verarbeitung nachzusehen, ob sie schon dort drin stehen.



  • eine fage habe ich noch..wieso durchläuft er jede zeile 2 mal......?



  • Keine Ahnung - vielleicht solltest du dazu mal die komplette Schleife zeigen.



  • if (file.good())
    	{
    	//file.seekg(0L, ios::beg);
    	std::string strZeile;
    	ofile.open("bla.txt",ios::out|ios::ate);
    	ofile << "Kurzwahlnummern\n";
    		while (getline(file,strZeile))
    		{
    			size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
    			if(start==string::npos) continue;
    			string teil (strZeile.substr(start,ende-start));
    		ofile <<  "\t" << teil.insert(0,teil) << "\n";		
    		}
    		ofile.close();
    	}
    

    ausgabe:
    Kurzwahlnummern
    +(49)3520574508+(49)3520574508
    +(49)00335423123+(49)00335423123
    jede nummer steht aber nur einaml drin in der datei



  • alter schrieb:

    ofile << "\t" << teil.insert(0,teil) << "\n";

    Was hat denn das insert() dort zu suchen? Damit fügst du den Inhalt von 'teil' an den Anfang des Strings 'teil' ein (und verdoppelst ihn auf diese Weise). Ein einfaches ofile<<"\t"<<teil<<"\n"; reicht völlig aus.



  • ja ok nun muss ich nur noch die +(49) in eine 00 umwandeln......wie und wo mach ic das am besten?



  • Wo? Zwischen dem Erzeugen von teil und der Ausgabe
    Wie? Ich würde replace() verwenden (unter der Voraussetzung, daß das "+(49)" am Anfang des Strings steht): teil.replace(0/*Startposition*/,4/*Länge*/,"00"/*Ersatztext*/);


Anmelden zum Antworten