Text in Zeile ändern



  • substr könnte nützlich sein:
    http://www.cplusplus.com/reference/string/string/substr.html

    insert für das einfügen:
    http://www.cplusplus.com/reference/string/string/insert.html

    und replace auch:
    http://www.cplusplus.com/reference/algorithm/replace_if.html

    Schau auch da die Beispiele an. Die sind sehr einfach und verständlich. Zwar in Englisch, aber da kommst du bei guten Tuts eh nicht drum herum..



  • Hallo!
    Ich mal versucht ne Loesung fuer dich zu programmieren, vielleicht hilfts dir (hoffe ich hab das alles richtig verstanden):

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <cstddef>
    
    using namespace std;
    
    const short CHARNUM = 60;	//Abstand bis zum Datum etc.
    
    string GetLine(string);
    string GetRest(string);
    
    int main()
    {
    	string filename, zeile, neuerinhalt;
    	char ifchange;
    	ifstream inp;
    	ofstream outp;
    	vector<string> inhalt;
    
    	cout << "Dateiname eingeben: ";
    	cin >> filename;
    	cout << "\n";
    
    	inp.open(filename.c_str(), ios::binary | ios::in);
    
    	if (!inp)
    	{
    		cerr << "Es ist ein Fehler beim Lesen der Datei aufgetreten!";
    		return -1;
    	}
    
    	while (!inp.eof())
    	{
    		getline(inp, zeile);
    		inhalt.push_back(zeile);
    	}
    
    	inp.close();
    
    	outp.open(filename.c_str(), ios::binary | ios::out);
    
    	if (!outp)
    	{
    		cerr << "Es ist ein Fehler beim oeffnen der Datei im Schreibmodus aufgetreten";
    		return -1;
    	}
    
    	cout << "\nZeilenweises aendern der Datei\n\n";
    
    	for (size_t i=0; i<inhalt.size(); i++)
    	{
    		cout << "Aktueller Inhalt der Zeile " << i+1 << ":\n" << GetLine(inhalt[i]) << endl;
    		cout << "Zeile aendern(j/n)? ";
    		cin >> ifchange;
    
    		if (toupper(ifchange) == 'J')
    		{
    			cout << "\n\nNeuer Zeileninhalt eingeben: ";
    			cin >> neuerinhalt;
    
    			for (size_t a=neuerinhalt.size(); a<CHARNUM; a++)
    				neuerinhalt += " ";
    
    			inhalt[i] = neuerinhalt + GetRest(inhalt[i]);
    		}
    
    		outp << inhalt[i];
    
    		cout << "\n\n";
    	}
    
    	outp.close();
    
    	cout << "Bearbeitung beendet! Bitte ENTER druecken zum beenden ...";
    	cin.get();
    
    	return 0;
    }
    
    string GetLine(string line)
    {
    	string temp;
    	for (size_t i=0; i<line.size() && i<CHARNUM; i++)
    		temp.push_back(line[i]);
    
    	return temp;
    }
    
    string GetRest(string line)
    {
    	string temp;
    	for (size_t i=CHARNUM; i<line.size(); i++)
    		temp.push_back(line[i]);
    
    	return temp;
    }
    

    Der Inhalt der Testdatei sieht so aus:

    Text                                                        | 27.01.09 16:50:33 |
    

    Gruesse,
    Cartman



  • Vielen Dank Eric Cartman und drakon für eüre riesen Mühe.
    Das finde ich so lieb das ihr mir helft.

    Leider muss ich jetzt in die Schule, aber ich schaus mir bestimmt am Abend an.

    Schönen Tag wünsche ich eüch noch, bis am Abend...

    Gruss



  • Hallo Eric

    Ich habe nun deine Funktion probiert, leider funktioniert sie bei mir nicht, kannst du mir nochmals helfen???

    Ich zeig dir mal die Fehler die es mir anzeigt.

    Zeile 54: C:\C++Programm\funktionen.cpp no matching function for call to `getline(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'

    Zeile 63: C:\C++Programm\funktionen.cpp `CHARNUM' undeclared (first use this function)

    Zeile 66: C:\C++Programm\funktionen.cpp `GetRest' undeclared (first use this function)

    Und noch andere...
    Ich habe deine Programmbibliotheken auch übernommen, daran kann es nicht liegen?

    Gruss



  • Hallo Anita.
    Was hast du denn genau gemacht? Versuchst du das gerade in eine Header-Datei zu binden? Musst mich einwenig aufklaeren 🙂



  • Eric Cartman schrieb:

    Hallo Anita.
    Was hast du denn genau gemacht? Versuchst du das gerade in eine Header-Datei zu binden? Musst mich einwenig aufklaeren 🙂

    In meine "aendern()" Funktion habe ich sie 1:1 übernommen.

    Und diese rufe ich dann im main(), per Switch Funktion auf, oder hatte das jedenfalls vor.



  • Was genau hast du uebernommen? Welchen Teil des Codes?
    Ich geh mal davon aus du meinst eine Funktion um den text zu aendern:

    void SetLine(string& inhalt, string inhaltneu)
    {
    	for (size_t a=inhaltneu.size(); a<CHARNUM; a++)	// ggf. Leerzeichn hinzufuegen
    		inhaltneu += " ";
    
    	while (inhaltneu.size() > CHARNUM)	// falls String zu lang ist - dann abschneiden
    		inhaltneu.erase(inhaltneu.end()-1);
    
    	inhalt = inhaltneu + GetRest(inhalt);
    }
    

    Gruss
    Cartman



  • Eric Cartman schrieb:

    Was genau hast du uebernommen? Welchen Teil des Codes?
    Ich geh mal davon aus du meinst eine Funktion um den text zu aendern:

    void SetLine(string& inhalt, string inhaltneu)
    {
    	for (size_t a=inhaltneu.size(); a<CHARNUM; a++)	// ggf. Leerzeichn hinzufuegen
    		inhaltneu += " ";
    
    	while (inhaltneu.size() > CHARNUM)	// falls String zu lang ist - dann abschneiden
    		inhaltneu.erase(inhaltneu.end()-1);
    
    	inhalt = inhaltneu + GetRest(inhalt);
    }
    

    Gruss
    Cartman

    Ja genau, ich habe einfach meinen Inhalt gelöscht, der ja sowieso nicht richtig funktionierte und habe deine ganzen Zeilen rüber kopiert.

    War das nicht so gedacht? 🙂



  • Ich hab mir mal die Muehe gemacht, das ganze etwas mehr "einzupacken". Ich hoffe dadurch wird einiges klarer.
    Aus Platzgruenden und der Uebersichtlichkeit halber hab ich einfach so ne Code-Paste-Seite genommen.

    die "funcs.h"-Headerdatei:
    http://rafb.net/p/3LJZZS88.html

    die "funcs.cpp"-Datei:
    http://rafb.net/p/JQL7CP51.html

    Und hier ein Beispiel wie du das ganze einsetzen kannst:
    http://rafb.net/p/8eVpB539.html

    Gruss
    Cartman

    //edit
    lol, jetzt hab ich als Nickname bei der Seite nen Nickname ausmm anderen Forum genommen 😃



  • Eric Cartman schrieb:

    //edit
    lol, jetzt hab ich als Nickname bei der Seite nen Nickname ausmm anderen Forum genommen 😃

    Und jetzt ist der sauer...? 🙂

    Hey jetzt hats mir funktioniert, toll. Vielen Dank.

    Leider zählt es mir jetzt jede Zeile ab, also nicht wie vorhin, dass ich die Nummer eingeben kann.
    Kann ich da vielleicht das alte rüber kopieren, verträgt sich das?

    Gruss



  • Anita80 schrieb:

    Leider zählt es mir jetzt jede Zeile ab, also nicht wie vorhin, dass ich die Nummer eingeben kann.
    Kann ich da vielleicht das alte rüber kopieren, verträgt sich das?

    Gruss

    Eine gute Möglichkeit und Übung den Code verstehen zu lernen. 😉
    Du kannst es ja mal versuchen und wieder posten, wenn du nicht mehr weiterkommst..



  • drakon schrieb:

    Anita80 schrieb:

    Leider zählt es mir jetzt jede Zeile ab, also nicht wie vorhin, dass ich die Nummer eingeben kann.
    Kann ich da vielleicht das alte rüber kopieren, verträgt sich das?

    Gruss

    Eine gute Möglichkeit und Übung den Code verstehen zu lernen. 😉
    Du kannst es ja mal versuchen und wieder posten, wenn du nicht mehr weiterkommst..

    Ok ich versuche es mal zu ändern, kann ja seine dass ich mal Glück habe... 😃



  • Hast du mir nochmals Zeit drauf zu schauen, finde einen Fehler noch nicht, und zwar löscht es mir immer alle Zeilen, bis auf die, die ich eingegeben habe.

    Speichert es die anderen nicht mehr?

    Hier mal der abgeänderte code.

    unsigned int nr;
        ifstream inp; ofstream outp;
    	string temp, neuinhalt; vector<string> inhalt;
    	string line;
    	char linechange = ' ';
    
    	inp.open("Ablage.txt", ios::binary | ios::in);
    	if (!inp)
    	{
    		cerr << "Fehler beim oeffnen!"; return -1;
    	}
    
    	while (!inp.eof())
    	{
    		getline(inp, temp);
    		inhalt.push_back(temp);
    	}
    
    	inp.close();
    
    	outp.open("Ablage.txt", ios::binary | ios::out);
    
    	if(!outp)
    	{
    		cerr << "Fehler beim schreiben!";
    		return -1;
    	}
    
        while (getline(inp, line)) 
    
      {
    
        inhalt.push_back(line);
    
      }
    
      cout << Abst << Abst << Abst << "Zeilennummer (1-" << inhalt.size()-1 << "): ";
    
      if (cin >> nr && nr >= 1 && nr <= inhalt.size()) 
    
      {
    
        --nr;
        cin.ignore(1 << 13, '\n');
    
      } 
                     else 
                     {
    
                     return 1;
    
                     }
    
      cout << Abst << Abst << Abst << "Aktueller Inhalt der Zeile" << line 
      << ": " << inhalt[nr] << endl;
    
    			cout << "\nNeuer Inhalt: ";
    			getline(cin, neuinhalt);
    			SetLine(inhalt[nr], neuinhalt);
    
    		outp << inhalt[nr] << '\n';
    		linechange = ' ';
    
    	outp.close();
    
        return 0;
    }
    

    Gruss



  • Ich habe den Fehler 😃

    Auch ein blindes Hunh findet mal ein Korn....

    Haha, besten Dank dir Eric, ohne dich wäre ich jetzt im .....

    Super das es noch so Menschen wie dich gibt.

    Ich wünsche dir noch einen schönen Abend!

    Gruss


Anmelden zum Antworten