suchen einer bestimmten zeichenkette
-
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*/);
-
okdanke aber ichhabe es fast alleine gelöst...*stolz bin nur das ich dann bei der zweiten nummer 0000 habe
Ausgabe:
test 1 0 0 003520574508
test 1 0 1 0000335423123if (file.good()) { //file.seekg(0L, ios::beg); std::string strZeile; string null ("00"); ofile.open("bla.txt",ios::out|ios::ate); ofile << "Kurzwahlnummern\n" << "\t Knoten \t Kurzwahlnummer \t Kurzwahl nach Bereichen \t Kurzwahlnummer \t Rufnummer\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)); teil.replace(0,5,null); ofile << "\t test \t 1 \t 0 \t" << i << "\t" << teil << "\n"; i++; } ofile.close(); }was ist falsch?
-
replace() ersetzt den angegebenen Teil des Strings - was sonst im String steht, wird ignoriert (und muß von dir ausgewertet werden). Das heißt, wenn du unterschiedliche Behandlungen für "+(49)xyz" und "+(49)00xyz" Nummern brauchst, mußt du erstmal feststellen, wie die aktuelle Nummer aussieht - und dann entsprechend reagieren (if(teil.substr(5,2)=="00")...).