Text in Zeile ändern



  • Hallo zusammen
    Ich bin neu hier und brauche eure Hilfe.

    Ich habe da eine Funktion geschrieben, mit der ich aus einer Datei Zeilen lesen kann, sie ändern und sie wieder speichern kann. Jetzt aber habe ich in der Zeile Formatierungen und die sind leider auch mit gespeichert.
    Meine Frage, kann mir jemand zum folgenden Code sagen, was ich ändern muss damit ich die Zeile öffnen kann, den Text ändern kann, ohne dass es mir die Formatierung verschiebt und wieder in die gleiche Zeile hineinkopieren kann?
    Dazu der Code...

    unsigned int nr;
    string line;

    fstream file("Ablage.txt", ios::in);

    if (!file.is_open())

    {
    return 1;
    }

    vector<string> content;

    while (getline(file, line))

    {

    content.push_back(line);

    }

    cout << Abst << Abst << Abst << "Zeilennummer (1-" << content.size() << "): ";

    if (cin >> nr && nr >= 1 && nr <= content.size())

    {

    --nr;
    cin.ignore(1 << 13, '\n');

    }
    else
    {

    return 1;

    }

    cout << Abst << Abst << Abst << "Aktueller Inhalt der Zeile" << line
    << ": " << content[nr] << endl;

    cout << Abst << Abst << Abst << "Bitte neuer Inhalt eingeben: ";

    if (!getline(cin, content[nr]))

    {

    return 1;

    }

    file.close();
    file.clear();

    file.open("Ablage.txt", ios::out | ios::trunc);

    copy(content.begin(), content.end(),
    ostream_iterator<string>(file, "\n"));

    return 0;

    Besten Dank

    Anita



  • Um was für Formatierungen geht es denn? Einlesen, manipulieren und wieder schreiben reicht nicht?



  • Geht eigentlich schon, leider kann ich hier keine Bild einfügen, aber ich zeige mal so wie die Zeile aufgebaut ist.

    ----------------------------------------------------------------------------------
    Text in der Zeile............................................| 27.01.09 16:50:33 |
    ----------------------------------------------------------------------------------

    So sieht ca. meine Zeile im Programm aus, jetzt möchte ich den Text ändern, aber das Datum möchte ich beibehalten und auch die Striche "|" und was eben noch wichtig ist, dass alles nicht verschoben wird.

    Die Punkte sind nicht gespeichert, dort sollte wuasi noch Platz sein für grössere Texte.

    Bis jetzt ist mir nur gelungen den Text neu einzugeben, aber dann war der Rest eben gelöscht...

    Gruss



  • Formatierungen dienen allein der Aufbereitung einer Zeile und werden nicht in der Datei gesondert gespeichert. Ansonsten hast Du die Datei mit ios::in nur zum Lesen geöffnet. Vorschlag: öffne zwei Dateien, eine zum Lesen und eine zum Schreiben und entscheide selbst, was Du schreiben willst. Das ist einfacher als eine Datei für beides und vermeidet weitere Komplikationen.



  • Anita80 schrieb:

    Geht eigentlich schon, leider kann ich hier keine Bild einfügen, aber ich zeige mal so wie die Zeile aufgebaut ist.

    ----------------------------------------------------------------------------------
    Text in der Zeile............................................| 27.01.09 16:50:33 |
    ----------------------------------------------------------------------------------

    So sieht ca. meine Zeile im Programm aus

    brauchst Du den Text, bevor Du ihn änderst und wenn ja benötigst Du ihn komplett mit Leerzeichen oder möglichst ohne?
    Ist vor dem Lesen bekannt, wie in welcher Spalte das erste '|'steht? Ist das in jeder Zeile gleich?



  • Denn ZeilenInhalt brauche ich nur, um im Anfang zu zeigen was in der Zeile drin steht, so wie hier... Also eigentlich komplett...

    Anita80 schrieb:

    cout << Abst << Abst << Abst << "Aktueller Inhalt der Zeile" << line
    << ": " << content[nr] << endl;

    Die Leerzeichen brauche ich für den Abstand, dass das erste "|" an der richtigen Stelle steht.

    Ja die "|" Zeichen sind überall gleich, bis aufs Datum wo dann drin steht.



  • berniebutt schrieb:

    Formatierungen dienen allein der Aufbereitung einer Zeile und werden nicht in der Datei gesondert gespeichert. Ansonsten hast Du die Datei mit ios::in nur zum Lesen geöffnet. Vorschlag: öffne zwei Dateien, eine zum Lesen und eine zum Schreiben und entscheide selbst, was Du schreiben willst. Das ist einfacher als eine Datei für beides und vermeidet weitere Komplikationen.

    Ich weiss dass ich die Zeichen nicht mitspeichern hätte sollen, aber ich bin noch recht unerfahren in dem Gebiet und wir müssen für die Schule so ein Projekt machen und leider reicht mir die Zeit nicht mehr um noch etwas anzupassen.

    Ich wäre schon sehr zufrieden wenn mir das mit den Zeilen änden funktionieren würde. Ich hoffe das kriege ich irgend wie hin.

    Gruss



  • Du kannst du das ganze File Zeilenweise einlesen und dann einfach die Zeile anpassen, die du möchtest und dann alles wieder speichern.
    Du kannst ja z.B mit Tabstopps die Rechte spalte positionieren.



  • drakon schrieb:

    Du kannst du das ganze File Zeilenweise einlesen und dann einfach die Zeile anpassen, die du möchtest und dann alles wieder speichern.
    Du kannst ja z.B mit Tabstopps die Rechte spalte positionieren.

    Würde ich sofort machen wenn ich wüsste wie 🙂

    Das Problem ist, ich habe null Ahnung wie ich in dem String drinnen etwas machen kann, ich habe die Funktion wo ich da habe auch nicht selber geschrieben, sondern vom Internet.

    Wenn du mir genau erklärst, am Besten mit einem Beispiel würde ich es gerne probieren.

    Gruss



  • Zeile in string einlesen:
    http://www.cplusplus.com/reference/string/getline.html
    Kein Problem. 😉

    Und einen string zu bearbeiten kannst du mit den Funktionen machen:
    http://www.cplusplus.com/reference/string/string/

    Für dich sind wahrscheinlich die find und replace Sachen von nützen.

    Für ein grosses Beispiel bin ich Heute zu faul. Sorry. 😉
    Mit ein wenig Geduld, solltest du dich dort mit den Beispielen zurecht finden.

    Falls du noch ein wenig mehr Funktionen brauchst, kannst du dir die mal anschauen:
    http://www.cplusplus.com/reference/algorithm/

    Funktionieren auch auf normale Container und nicht nur string.



  • drakon schrieb:

    Zeile in string einlesen:
    http://www.cplusplus.com/reference/string/getline.html
    Kein Problem. 😉

    Und einen string zu bearbeiten kannst du mit den Funktionen machen:
    http://www.cplusplus.com/reference/string/string/

    Für dich sind wahrscheinlich die find und replace Sachen von nützen.

    Für ein grosses Beispiel bin ich Heute zu faul. Sorry. 😉
    Mit ein wenig Geduld, solltest du dich dort mit den Beispielen zurecht finden.

    Falls du noch ein wenig mehr Funktionen brauchst, kannst du dir die mal anschauen:
    http://www.cplusplus.com/reference/algorithm/

    Funktionieren auch auf normale Container und nicht nur string.

    Also ich denke, dann muss ich aus dem String an der x-ten Stelle die Zeichen herauskopieren("|" und Datum) und in einen anderen String kopieren, nun gebe ich im originall string den neuen Text ein und kopiere an der x-ten stell wieder den zweiten String hinein, denk ich da rcihtig? 🙂

    Dafür brauche ich die zwei Befehle, oder welche?



  • Anita80 schrieb:

    Also ich denke, dann muss ich aus dem String an der x-ten Stelle die Zeichen herauskopieren("|" und Datum) und in einen anderen String kopieren, nun gebe ich im originall string den neuen Text ein und kopiere an der x-ten stell wieder den zweiten String hinein, denk ich da rcihtig? 🙂

    Dafür brauche ich die zwei Befehle, oder welche?

    Wenn ich dich richtig verstehe ja so in etwa..(ich weiss ja nicht, was du bearbeiten willst. 😉

    Wenn du wirklich komfortablen solche strings bearbeiten willst, empfiehlst sich eine regex-Bibliothek zu nutzen, wie z.B boost::regex

    Brauch aber auch eine gewisse Einarbeitungszeit. 😉



  • drakon schrieb:

    Anita80 schrieb:

    Also ich denke, dann muss ich aus dem String an der x-ten Stelle die Zeichen herauskopieren("|" und Datum) und in einen anderen String kopieren, nun gebe ich im originall string den neuen Text ein und kopiere an der x-ten stell wieder den zweiten String hinein, denk ich da rcihtig? 🙂

    Dafür brauche ich die zwei Befehle, oder welche?

    Wenn ich dich richtig verstehe ja so in etwa..(ich weiss ja nicht, was du bearbeiten willst. 😉

    Wenn du wirklich komfortablen solche strings bearbeiten willst, empfiehlst sich eine regex-Bibliothek zu nutzen, wie z.B boost::regex

    Brauch aber auch eine gewisse Einarbeitungszeit. 😉

    Vielen Dank für deine Hilfe, ich probiere jetzt mal ob ich es zustande bekomme.

    Gruss



  • Ich lass die Kacke sein, habe den ganzen Abend probiert und konnte nicht einen einzigen Buchstabe von einem string in den anderen kopieren, das nennt man Zeitverschwendung. 😡



  • Anita80 schrieb:

    Ich lass die Kacke sein, habe den ganzen Abend probiert und konnte nicht einen einzigen Buchstabe von einem string in den anderen kopieren, das nennt man Zeitverschwendung. 😡

    Ganz ruhig.. Geh schlafen und schau dir die Beispiele Morgen nochmal an und wenn es nicht klappt, poste das, was du nicht verstehst hier. (Und bitte möglichst genau, was du willst.. das löst meistens die Frage eigl. schon selbst.. ;))



  • drakon schrieb:

    Anita80 schrieb:

    Ich lass die Kacke sein, habe den ganzen Abend probiert und konnte nicht einen einzigen Buchstabe von einem string in den anderen kopieren, das nennt man Zeitverschwendung. 😡

    Ganz ruhig.. Geh schlafen und schau dir die Beispiele Morgen nochmal an und wenn es nicht klappt, poste das, was du nicht verstehst hier. (Und bitte möglichst genau, was du willst.. das löst meistens die Frage eigl. schon selbst.. ;))

    Das Problem ist die Zeit...
    Ich habe probier, ein String in einen anderen zu kopieren. Einfach die zeichen und leerzeichen von anfang an zu ersetzen, so dass es mir nichts verschiebt, dann wäre mein Problem gelöst...Aber eben.

    Und die blöden Internetseiten wo das erklärt ist sind auch noch in english...



  • 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


Anmelden zum Antworten