Probleme bei Umsetzung eines Programms mit Stringmanipulation
-
Hey! Eben schonmal Alles geschreiben, dann PC abgestürzt
Also hier die kurzfassung:
Habe Programm, dass eine Datei auslesen soll welche so aufgebaut ist:
[ROUTER] Item1=0 Item2= Item3= WinER + Item4= WinER [USER] Item1= Item2= Item3= 2212x usw.
Ziel des Programms ist es nun, dass am ende kein Item Eintrag mehr leer ist.
Mein Code bisher sieht so aus (Ja, unstrukturiert ich weiß, bin grad in Eile, da es eine Praktikumsaufgabe war und ich jetzt noch meine Mutti im Krankenhaus besuchen gehe).:
[cpp]#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>using namespace std;
int main()
{
fstream datei("saplogon.ini", ios:: in | ios::out);
string buffer;
string s;
int lines1=0; //Anzahl Zeilen (vorher)
int lines2=0; // Anzahl Zeilen (Temporär bzw nachher)
while (!datei.eof() && datei.good())
{
getline(datei,buffer);
s+=buffer;
s+="\n";}
cout<<s;
datei.close();
remove("saplogon.ini");string search, insert; // Suche und einzufügender Text
*int pos1, pos2, pos3;
pos1 = s.find("[");
pos2 = s.find("]");
cout<<pos1<<endl;
string::iterator m;
for(m=pos1;m=pos2;m++)
{
cout<<m<<endl;
}
getch();cout<<"Zu suchendes Textstueck: \n"<<endl;
cin>>search;
pos3 = s.find(search); // Gesuchte Postion
if(pos3>=0) {
getch();
cout<<"Einzufügendes Textstück: \n"<<endl;
cin>>insert;
s.insert(pos3, insert);
}else
{ cout<<"Textstueck konnte nicht gefunden werden!"<<endl;
getch();
}fstream dateineu("saplogon.ini", ios::out);
dateineu << s;
dateineu.close();}
[/cpp]Der dickgedruckte Part macht bisher die meisten Probleme. Da kommen Fehlermeldungen "no match for operator= in m= pos2 " und das auch noch mit pos1.
Könnt ihr mir Helfen?
-
#include <iostream> #include <fstream> #include <conio.h> #include <string> using namespace std; int main() { fstream datei("saplogon.ini", ios:: in | ios::out); string buffer; string s; int lines1=0; //Anzahl Zeilen (vorher) int lines2=0; // Anzahl Zeilen (Temporär bzw nachher) while (!datei.eof() && datei.good()) { getline(datei,buffer); s+=buffer; s+="\n"; } cout<<s; datei.close(); remove("saplogon.ini"); string search, insert; // Suche und einzufügender Text int pos1, pos2, pos3; pos1 = s.find("["); pos2 = s.find("]"); cout<<pos1<<endl; string::iterator m; for(m=pos1;m=pos2;m++) { cout<<*m<<endl; } getch(); cout<<"Zu suchendes Textstueck: \n"<<endl; cin>>search; pos3 = s.find(search); // Gesuchte Postion if(pos3>=0) { getch(); cout<<"Einzufügendes Textstück: \n"<<endl; cin>>insert; s.insert(pos3, insert); } else { cout<<"Textstueck konnte nicht gefunden werden!"<<endl; getch(); } fstream dateineu("saplogon.ini", ios::out); dateineu << s; dateineu.close(); }
Hier der Code eingebettet, kann ja nicht mehr editieren. Zeilen 31 - 41 machen Probleme.
-
http://www.cplusplus.com/reference/string/string/find/
Guck mal auf den Rückgabewert.
-
m ist ein string::iterator und
pos1
ein int. Es gibt keinen =operator für diese Operanden. Entweder machst Dum = s.begin() + pos1;
oder Du arbeitest halt nur mit dem Index. Hab deinen Code jetzt nicht nachvollzogen, um beurteilen zu können was Du da eigentlich machen willst.Außerdem solltest Du Dir die for Schleife nochmal genauer angucken.
for(m=pos1;m=pos2;m++) { cout<<*m<<endl; }
Selbst wenn m jetzt ein int ist und die Zuweisung funktioniert, passiert etwas anderes als Du vermutlich vorhast, denn
m=pos2
ist nichtm == pos2
und es wird zu einer Endlosschleife (oder sie wird überhaupt nicht durchlaufen, jenachdem welchen Wert pos2 hat).
-
So, bin wieder da! Hier nochmal ausführlich meine Probleme:
Ziel des Programmes ist es, die Leeren Felder (Die, in denen nur Item1= / Item2= etc. steht) zu finden, zusammen mit der übergeordneten Kategorie (Den Begriffen in den eckigen Klammern wie zb [ROUTER]) dem User zu präsentieren und um eine Eingabe eines Wertes zu bitten. Die leeren Felder sollte er automatisch erkennen, so dass eine Benutzereingabe des gesucht leeren Feldes wegfällt. Nun weiß ich nicht, wie ich einen Text zwischen zwei Zeichen ausgeben kann( zb den zwischen den eckigen Klammern) und wie ich es schaffe, das Programm automatisch alle leeren Felder erkennen zu lassen.
Habt ihr eine Idee?
-
Alles mit fertiger Lösung einlesen, z.B.
http://www.boost.org/doc/libs/1_48_0/doc/html/boost_propertytree/parsers.html#boost_propertytree.parsers.ini_parserleere values finden und abfragen. Dann alles wieder mit fertiger Lösung schreiben. Alternativ zu boost gibt es auch irgendwelche gruseligen WinAPI Funktionen.