.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 DateiSoweit 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:42Und nach der Ausführung des Programms:
wert1:4 wert2:8 wert3:108 wert4:16 wert5:23 wert6:42Wie 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 DateiMfg
Cascoin
-
ok, dann gehört diese frage wohl eher ins ansic forum