Kann man in einer text datei in eine bestimmte zeile schreiben?

Ich nutze hin und wieder Textdateien als Konfiguartionsdateien für meine Projekte.

Ich schreibe folgendermaßen in so eine Datei:

void save_config() {
    File f;
    f = SPIFFS.open("/config.txt", "w");
    f.println(helligkeit); // Zeile 1
    f.println(effekt_nr);  // Zeile 2
    f.println(automatik);  // Zeile 3
    f.close();
}

Ich schreibe also Zeile für Zeile in die Textdatei.
Gibt es eine Möglichkeit das ich zB. nur Zeile 3 in die Datei schreibe (verändere) und alles andere unverändert lasse?

Nur, wenn alle Zeilen gleich lang sind.

Eigentlich ja, aber bei der letzten Zeile könnte es auch so zur Not funktionieren.

Gruß Tommy

Was heißt eigentlich ja? Gleich lang sind die Zeilen nicht.
Angenommen ich möchte Zeile 2 von 10 verändern. Geht das? Wenn ja wie?

"eigendlich ja" heißt, dass es ie Mühe nicht wert ist.

Eigentlich ja (von mir unglücklich formuliert) heißt: Ja, es geht nicht, wenn die Zeilen ungleich lang sind. Außer evtl. bei der letzten Zeile mit Tricks und nicht sauber.

Gruß Tommy

Ach so :slight_smile: Dann mach ich das halt anders.

Danke für eure Hilfe!

Angenommen ich möchte Zeile 2 von 10 verändern. Geht das? Wenn ja wie?

Zeile 1 lesen und in neue Datei config.new schreiben
Zeile 2 lesen, verändern und an config.new anfügen
Zeile 3-10 lesen und an config.new anhängen.
config.new schließen
config.txt schließen
config.txt löschen
config.new auf config.txt umbenennen

Man kann eine Datei mit fester Zeilenlänge (record size) benutzen. Dann weiß man wo eine Zeile in der Datei beginnt und wo sie endet. Unbenutzte Spalten werden mit Leerzeichen gefüllt. So kann man auch kürzere Zeilen in der Datei haben, aber für längere Zeilen muß die ganze Datei neu geschrieben werden.

Zeile 1 lesen und in neue Datei config.new schreiben

Auf kleinen Arduinos mit 2 kB RAM (Uno/Nano) kann man mit den üblichen Bibliotheken keine zwei Dateien gleichzeitig öffnen.

Man kann eine Datei mit fester Zeilenlänge (record size) benutzen

Üblicherweise ist nach dem Schreiben in eine Datei Länge = Schreibzeiger.
Muss man die möglichen Parameter beim .open genau ansehen.

In #0 sehe ich "SPIFFS", also ist es vermutlich kein kleiner AVR. Also Datei in String speichern, neu anlegen und veränderten String in Datei speichern.

Der TO hat noch nichts über die Länge der Datei gesagt.
Außerdem wie willst Du in einem String Teile eines Freitextes unterschiedlicher Länge sinnvoll auswechseln?

Gruß Tommy

Das ginge m.E. schon, wäre aber in C-Strings eine lustige Fummelei mit Anfang und Ende merken und den Rest ab der dritten "Zeile" vorziehen oder nach hinten schieben. Das gleiche Problem hätte man aber auch, wenn man ein Filesystem mit "seek" hätte.

Ich würde den Ansatz von Werner aus #7 bevorzugen - wenn das Filesystem das hergibt. Wenn die Dateien nicht zu lang sind und der Speicher groß genug, kann man das mit einem Array of Strings im Speicher ja mit einlesen, ändern, neu schreiben nachbilden.

die Werte aus 3 Zeilen (so wie im Code Schnippsel in #0) oder auch 10 Zeilen (so wie gefragt) kann man sicherlich kurzzeitig im Speicher halten, den einen Wert verändern und dann wieder alle zurückschreiben. Er schreibt ja eh nur den eigentlichen Wert in die Datei!

    f.println(helligkeit); // Zeile 1
    f.println(effekt_nr);  // Zeile 2
    f.println(automatik);  // Zeile 3

Tommy56:
Außerdem wie willst Du in einem String Teile eines Freitextes unterschiedlicher Länge sinnvoll auswechseln?

Am Anfang steht immer die gründliche Datenanalyse, dann die Auswahl des geeigneten Werkzeugs, dann die Umsetzung und Überprüfung.

In diesem Forum werden aus Unwissenheit gerne Wischiwaschifragen gestellt, die dann zu Antworten gleicher Güte führen. Dennoch möchte ich Möglichkeiten aufzeigen, auch wenn ich nicht sicher sein kann, ob ich das bei Kenntnis aller Fakten wirklich dann so machen würde.

Um es mit Dr. Who zu formulieren: "Ich habe einen Plan!". Wer die Serie schon mal gesehen hat, weiß nur zu gut, daß sich manche dieser Pläne als unsinnig erweisen ::slight_smile:

noiasca:
die Werte aus 3 Zeilen (so wie im Code Schnippsel in #0) oder auch 10 Zeilen (so wie gefragt) kann man sicherlich kurzzeitig im Speicher halten, den einen Wert verändern und dann wieder alle zurückschreiben. Er schreibt ja eh nur den eigentlichen Wert in die Datei!

Dann kann man die Werte auch gleich binär abspeichern, da läßt sich eine gleiche Länge (Datentyp) leicht bewerkstelligen. Dann kann man jeden Wert einzeln direkt in der Datei per random access ändern.

vieleicht hat's ja sonst Gründe warum er es in Klartext speichern will, weil download/upload ins spiffs so cool ist - oder was auch immer. Alles nur rumgerate. Wenn's nur ums persistieren von ein paar Werten geht, würde ICH auf dem ESP8266 die EEPROM Emulation mit einem Struct verwenden. Lesezugriff ein Einzeiler mit get, Schreibzugriff ein Zweizeiler mit put/commit. Aber jeder wie er/sie mag.

Ach, das geht alles....
Eine einfache verkettete Liste, mit einem Index für die Zeilenanfänge, dann klappt das.
Textverarbeitungen machen das auch so ähnlich, dann aber mit Bäumen.

Zur Belohnung darf man sich dann auch um Fragmentierungen Sorgen machen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.