.txt File an bestimmter Stelle bearbeiten



  • Hallo allerseits,

    ich bräuchte mal wieder eure Hilfe. Und zwar möchte ich
    einen vom Benutzer eingegebenen Zahlenwert an einer
    bestimmt Stelle in einer .txt File speichern.
    Wie geht das?

    Ich habe schon eine Funktion zum einlesen/laden von Werten die funktioniert.

    fopen(FilNam,"r+") //oeffnet mir die Datei
    while ((x=fgetc(y))!=EOF) //liest File ein
    fscanf //"scannt" die Datei nach Schlagwörtern
    //nach diesem Schlagwort kommt die Zahl
    //die eingelesen wird
    fscanf //ließt dann den gewünschten Wert ein
    fclose //schließt Datei

    Soweit paßt ja alles.

    Aber ich möchte ja nichts laden sondern speichern.
    Ich wäre dann so vorgegangen das ich die Funktion einfach so lasse
    und nur fprintf mit fscanf vertausche. Ich hab gedacht das ich dann
    genau an die Stelle meinen gewünschten Wert schreiben kann. Leider
    funktioniert das nicht. Die .txt File wird bearbeitet aber ist dann
    komplett leer. Ich verstehe ja nichtmal warum das so ist.
    Hat da jemand ne Idee bzw. einen Lösungsvorschlag? Wäre sehr cool.

    Danke

    casccoin 🤡



  • Willst du das ganze nun in C oder in C++ machen? Denn dein Code tendiert sehr stark zu C. In C++ würde ich die Datei zuerst in einem Container (z.B. std::vector, std::list, std::map, etc.) einlesen, die Daten dann innerhalb des Containers ändern und das ganze wieder in die Datei zurückschreiben. Je nachdem wie der Inhalt deiner Datei aufgebaut ist, könnte dir ja zum Beispiel folgendes schon reichen:

    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string>
    #include <map>
    
    bool mapToFile(std::map<std::string, int>::const_iterator beg, std::map<std::string, int>::const_iterator end, const char delim, const std::string &filename)
    {
    	std::ofstream file(filename.c_str());
    	if(!file) {
    		return false;
    	}
    	while(beg != end) {
    		file << beg->first << delim << beg->second << "\n";
    		++beg;
    	}
    	return beg == end;
    }
    
    bool fileToMap(std::map<std::string, int> &propMap, const char delim, const std::string &filename)
    {
    	std::ifstream file(filename.c_str());
    	if(!file) {
    		return false;
    	}
    	for(std::string line; std::getline(file, line); ) {
    		std::string::size_type pos(line.find_first_of(delim));
    		if(pos != std::string::npos) {
    			std::istringstream convert(line.substr(pos + 1));
    			convert >> propMap[line.substr(0, pos)];
    		}
    	}
    	return true;
    }
    
    int main()
    {
    	std::map<std::string, int> myProps;
    	if(!fileToMap(myProps, ':', "werte.txt")) {
    		std::cout << "Fehler beim lesen der Datei." << std::endl;
    		return 1;
    	}
    	for(std::map<std::string, int>::const_iterator beg(myProps.begin()), end(myProps.end()); beg != end; ++beg) {
    		std::cout << beg->first << " = " << beg->second << "\n"; // Die gelesenen Werte zur Überprüfung ausgeben
    	}
    	std::map<std::string, int>::iterator iter = myProps.find("wert3");
    	if(iter != myProps.end()) {
    		iter->second = 108; // Einen der Werte ändern
    	}
    	if(mapToFile(myProps.begin(), myProps.end(), ':', "werte.txt")) {
    		std::cout << "Alles roger!!" << std::endl;
    	} else {
    		std::cout << "Fehler beim Schreiben in die Datei." << std::endl;
    	}
    
    	return 0;
    }
    

    Inhalt der werte.txt vor der Ausführung:

    wert1:4
    wert2:8
    wert3:15
    wert4:16
    wert5:23
    wert6:42
    

    Und nach der Ausführung des Programms:

    wert1:4
    wert2:8
    wert3:108
    wert4:16
    wert5:23
    wert6:42
    

    Wie gesagt sei dies nur ein kurzes Beispiel. Es gibt viele Möglichkeiten dies zu machen und welche für dich geeignet sein könnte, hängt halt auch vom Aufbau deiner Datei ab.



  • danke soweit, aber das sieht mir doch ziemlich kompliziert aus.

    Zu meiner File: Die sieht ganz genau so aus wie du das Beispiel gesetzt hast.
    Jedenfalls wäre das mal ne Möglichkeit. Super!

    Jetzt will ich net unverschämt sein, aber hat jemand ne idee wie man das in C machen kann? Das sieht mir irgendwie leichter, verständlicher & kürzer aus. Bzw weiß jemand wieso meine Idee nicht funktioniert?

    Hier nochmals meine Idee:

    fopen(FilNam,"r+") //oeffnet mir die Datei
    while ((x=fgetc(y))!=EOF) //liest File ein
    fscanf //"scannt" die Datei nach Schlagwörtern
    //nach diesem Schlagwort kommt die Zahl
    //die eingelesen wird
    fprintf //schreibt dann den gewünschten Wert ein
    fclose //schließt Datei

    Mfg

    Cascoin



  • ok, dann gehört diese frage wohl eher ins ansic forum


Anmelden zum Antworten