INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
SD-Karte immer 1. Datensatz in Datei überschreiben
19.01.2019, 13:30 (Dieser Beitrag wurde zuletzt bearbeitet: 19.01.2019 13:34 von FritzHelmut.)
Beitrag #1
SD-Karte immer 1. Datensatz in Datei überschreiben
Hallo,
ich habe da ein kleines Problem und ich habe bisher in diesem riesigen Fundus nix konkretes für meinen Fall gefunden.

Wenn ich Daten auf die SD-Karte schreibe, wird der neue Datensatz immer an bestehende Datensätze angehängt.

datei = SD.open("zustand.txt", FILE_WRITE);
datei.println("mp_22; mp_23; mp_30; mp_34; m_Vz[1]");
datei.close();

Beispiel:
0 1 1 1 200
1 1 1 1 255
....
0 0 0 0 120
Also Zeile für Zeile.

Ich benötige bei einem Neustart ja immer nur den letzten Zustand bestimmter Variablen die ich in dieser Datei speichere.
Hier wie 2 x Weichen stehen, Fahrtrichtung des Block und aktuelle Geschwindigkeitswert der PWM. (Modellbahnsteuerung).

Ich könnte auch die alte Datei umbenennen oder löschen und jedesmal eine neue Datei erzeugen. Das möchte ich aber nicht.

Gibt es eine Möglichkeit, dass ich immer den ersten Datensatz in der File komplett überschreiben kann und nix angehängt wird!

Also z.B:
1 1 1 1 255

Hat jemand eine Idee wie der Schreibbefehl und / oder Positionierung aussehen
müsste?

MfG
Fritz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.01.2019, 13:56 (Dieser Beitrag wurde zuletzt bearbeitet: 19.01.2019 14:06 von Bitklopfer.)
Beitrag #2
RE: SD-Karte immer 1. Datensatz in Datei überschreiben
(19.01.2019 13:30)FritzHelmut schrieb:  ....
Hat jemand eine Idee wie der Schreibbefehl und / oder Positionierung aussehen
müsste?

MfG
Fritz

...da muß ich mal tief kruschteln gehen... aber es geht, hatte das mit einer Datei auch schon so mal gemacht.
...ich such mal...

gefunden:
Code:
void newFilename() {
  selSD();
  dataFile = SD.open(numFile,FILE_READ);
  // if the file is available, Lesen...
  if (dataFile) {
              dataFile.seek(0);
              for(i=0; i <= 4; i++ ) numbuffer[i] = dataFile.read();  // nur die ersten 5 Ziffern einlesen
                   Serial.println(numbuffer);
              //dataFile.flush();
              dataFile.close();
                }  
     dtNummer =  atoi(numbuffer);  // Dateinummer in Integer wandeln
     Serial.println(numbuffer);
     Serial.println(dtNummer);

//###### Filenummer neu generieren und speichern
    if(dtNummer <= 10000) dtNummer += 10000;  // Sicherstellen das Filenummer 5 stellig ist.
    dtNummer ++;                        // Increment
   selSD();
   dataFile = SD.open(numFile, FILE_WRITE);
  // if the file is available, write to it:
  if (dataFile) {
    dataFile.seek(0);
    dataFile.println(dtNummer);
    //dataFile.flush();
    dataFile.close();
                }            


//###### WDL  Filename generieren
  sprintf(numbuffer,"%5d",dtNummer);
  strcpy(WDLfile,"WD_");
  strcat(WDLfile, numbuffer);
  strcat(WDLfile, ".TXT");
  sdwrcount = 0;   // Counter ruecksetzen
  Serial.println(WDLfile);

}
  //### End of newFilename

Kurze Erklärung...hier wird eine Textdatei gelesen und zwar nur 5 Zeichen = Zahlen die dann umgeandelt werden und dann später zurückgeschrieben werden. Das Ganze dient dazu einen Dateinamen mit fortlaufendem Index zu erzeugen.
Das du immer auf die erste Stelle schreibst dürfte wohl mit diesem Befehl organisiert werden " dataFile.seek(0);" damit kommt immer an den Anfang der Datei... den Rest solltest nun leicht hinbekommen.

lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.01.2019, 16:55
Beitrag #3
RE: SD-Karte immer 1. Datensatz in Datei überschreiben
Hallo,
eigenlich eine Schlamperei in der SD-Lib. Die haben FILE_WRITE als FILE_APPEND ausgelegt und FILE_APPEND eingespart, warum auch immer.
Ich kenne "w" eigentlich so, daß der Zeiger auf den Dateianfang gesetzt wird und die Dateilänge auf 0, wenn die Datei existiert, sonst neu angelegt.
Nur bei "a" wird angehängt, wenn vorhanden oder neu erzeugt, wenn nicht.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.01.2019, 08:39
Beitrag #4
RE: SD-Karte immer 1. Datensatz in Datei überschreiben
Hallöchen,

vielen Dank für die SUPERSCHNELLEN Antworten.

Wenn das so aufwendig ist einen existierenden Datensatz zu überschreiben, dann werde ich lieber die existierende Datei umbenennen und eine neue erzeugen.
Das geht erheblich einfacher und vor allem viel schneller.

Falls doch noch jemand einen einfacheren Weg kennt, dann bitte her damit .... ;-)

Gruß Fritz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.01.2019, 10:16
Beitrag #5
RE: SD-Karte immer 1. Datensatz in Datei überschreiben
(21.01.2019 08:39)FritzHelmut schrieb:  Hallöchen,

vielen Dank für die SUPERSCHNELLEN Antworten.

Wenn das so aufwendig ist einen existierenden Datensatz zu überschreiben, dann werde ich lieber die existierende Datei umbenennen und eine neue erzeugen.
Das geht erheblich einfacher und vor allem viel schneller.

Falls doch noch jemand einen einfacheren Weg kennt, dann bitte her damit .... ;-)

Gruß Fritz

was ist daran so aufwendig diese eine Zeile
Code:
dataFile.seek(0);
einzufügen Huh
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2019, 00:43
Beitrag #6
RE: SD-Karte immer 1. Datensatz in Datei überschreiben
(21.01.2019 10:16)Bitklopfer schrieb:  
(21.01.2019 08:39)FritzHelmut schrieb:  Hallöchen,

vielen Dank für die SUPERSCHNELLEN Antworten.

Wenn das so aufwendig ist einen existierenden Datensatz zu überschreiben, dann werde ich lieber die existierende Datei umbenennen und eine neue erzeugen.
Das geht erheblich einfacher und vor allem viel schneller.

Falls doch noch jemand einen einfacheren Weg kennt, dann bitte her damit .... ;-)

Gruß Fritz

was ist daran so aufwendig diese eine Zeile
Code:
dataFile.seek(0);
einzufügen Huh
lgbk

Sorry,
als Nichtprofi habe ich versucht deinen Code nachzuvollziehen und wusste damit nicht all zuviel anzufangen.
Als Lösung hätte doch z.B. gereicht: Nutze dataFile.seek(0), dieser Befehl stellt sicher das das schreiben der Daten am Anfang der Datei beginnt ...
Trotzdem vielen Dank für die Hilfe, hast mir viel geholfen.
Gruß Fritz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2019, 01:00
Beitrag #7
RE: SD-Karte immer 1. Datensatz in Datei überschreiben
(25.01.2019 00:43)FritzHelmut schrieb:  ....
Sorry,
als Nichtprofi habe ich versucht deinen Code nachzuvollziehen und wusste damit nicht all zuviel anzufangen.
Als Lösung hätte doch z.B. gereicht: Nutze dataFile.seek(0), dieser Befehl stellt sicher das das schreiben der Daten am Anfang der Datei beginnt ...
Trotzdem vielen Dank für die Hilfe, hast mir viel geholfen.
Gruß Fritz

Deswegen hatte ich ja auch beschrieben was in dem Code vor sich geht...und auch noch extra das dataFile.seek(0) Kommando erwähnt...
....also wer lesen kann ist da im Vorteil...zudem solltest dann auch sehen was in deinem Code dem von meinem entspricht um das seek auch richtig zu platzieren...
Bitteschön...
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2019, 11:53 (Dieser Beitrag wurde zuletzt bearbeitet: 25.01.2019 12:20 von Tommy56.)
Beitrag #8
RE: SD-Karte immer 1. Datensatz in Datei überschreiben
(19.01.2019 16:55)amithlon schrieb:  Hallo,
eigenlich eine Schlamperei in der SD-Lib. Die haben FILE_WRITE als FILE_APPEND ausgelegt und FILE_APPEND eingespart, warum auch immer.
Ich kenne "w" eigentlich so, daß der Zeiger auf den Dateianfang gesetzt wird und die Dateilänge auf 0, wenn die Datei existiert, sonst neu angelegt.
Nur bei "a" wird angehängt, wenn vorhanden oder neu erzeugt, wenn nicht.

Gruß aus Berlin
Michael
Wobei man das einfach reparieren kann. In der Datei SD.h
Code:
// Zeile 24 alt
#define FILE_WRITE (O_READ | O_WRITE | O_CREAT | O_APPEND)
// ersetzen durch
#define FILE_WRITE (O_READ | O_WRITE | O_CREAT | O_TRUNC)
#define FILE_APPEND (O_READ | O_WRITE | O_CREAT | O_APPEND)

Gruß Tommy

Edit: Eine andere Möglichkeit ohne Eingriff in die Lib wäre das direkt beim open anzugeben:
Code:
dataFile = SD.open(numFile, O_READ | O_WRITE | O_CREAT | O_TRUNC);

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Zahl aus txt-Datei als globale Variable einlesen Lance101 13 167 Gestern 20:25
Letzter Beitrag: Tommy56
  "Angegebener Ordner/ZIP-Datei enthält keine gültige Bibliothek" EWdG 13 5.563 02.06.2018 09:52
Letzter Beitrag: hotsystems
  .ogg Datei in .flac umwandeln BluPxl 2 633 28.05.2018 18:54
Letzter Beitrag: amithlon
  Datei von SD Karte auf Display ausgeben dahans 30 3.479 06.02.2018 21:24
Letzter Beitrag: dahans
  Statusänderung auf SD-Karte schreiben querkopf71 12 1.801 27.11.2017 12:23
Letzter Beitrag: Tommy56
  Suche Hilfe für den Fehler in der Datei Holzwurm56 5 1.127 01.11.2017 14:26
Letzter Beitrag: Holzwurm56
  AnalogRead() von Batterie - Messe immer 1023 trotz analogReference(INTERNAL); Flap 9 2.019 18.10.2017 21:53
Letzter Beitrag: georg01
  SD-Karte und CSV-Datei... alpenpower 17 4.906 25.07.2017 10:37
Letzter Beitrag: alpenpower
  Arduino funktioniert immer erst nach reset Maxi290997 11 2.123 25.07.2017 09:38
Letzter Beitrag: Maxi290997
  Einlesen txt Datei auf Arduino gamma 21 5.251 21.07.2017 10:34
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste