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
C++ Frage: Parameter in TXT-File speichern, auslesen und variable zuweisen
21.07.2021, 16:24
Beitrag #1
C++ Frage: Parameter in TXT-File speichern, auslesen und variable zuweisen
Hi zusammen,

ich möchte gerne mal wieder ein bisschen was in Sachen C++ dazulernen.

Ich hab zwar für meinen Anwendungsfall bereits eine Lösung, bin mir aber sicher, dass das nicht der eleganteste Weg ist und das man das viel smarter machen kann.
Nur leider fehlt mir da wieder der C++ Background ;-(

Folgendes Szenario:

Ich will verschiedene Parameter in einer TXT Datei speichern, diese Auslesen und bestimmten Variablen zuweisen.

Die TXT-Datei ist folgendermaßen aufgebaut (fiktive Parameternamen und fiktive Werte):

Zitat:parameter_a*1
parameter_b*23
parameter_c*8
usw.

D.h. mit meinen stümperhaften Kenntnissen hab ich einfach Parametername und Parameterwert mit einem * als Separator getrennt.

Folgendermaßen lese ich die Parameter aus und weise sie den (zuvor deklarierten Variablen) zu:

Code:
void datei_auslesen() {
  File file_test = SPIFFS.open("file_test.txt", "r");
  char zeile[150];
  while (file_test.available()) {
    int l = file_einstellungen.readBytesUntil('\n', zeile, sizeof(buffer));
    zeile[l] = 0;
    char* token = "";
    char parameter_name[20];
    token = strtok(zeile, "*");
    int hck = 0;
    // +++Splitten in Parametername und Parameterwert
    while (token) {
      switch (hck) {
        case 0:
          strcpy(parameter_name, token);
          break;
        case 1:
          byte lastChar = strlen(token) - 1;
          token[lastChar] = '\0';
          if ((String)parameter_name == "parameter_a") {
            parameter_a = atoi(token);
          } else if ((String)parameter_name == "parameter_b") {
            parameter_b = atoi(token);
          } else if ((String)parameter_name == "parameter_c") {
            parameter_c = atoi(token);
          } else {
        // usw...
          }
          break;
      }
      token = strtok(NULL, "*");
      hck++;
    }

  }
  file_test.close();  //Close file
  return 0;
}

Ich bin mir sicher, dass das nicht der idealste Weg ist und vor allem habe ich ca. 20 Parameter und da sind das natürlich jede Menge if-then-Zweige.

Könnt ihr mir einen Tipp geben, wie man sowas anständig löst?
Evtl. über einen JSON-Array?

Danke schon mal und viele Grüße

Daniel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.07.2021, 16:41 (Dieser Beitrag wurde zuletzt bearbeitet: 21.07.2021 17:05 von Tommy56.)
Beitrag #2
RE: C++ Frage: Parameter in TXT-File speichern, auslesen und variable zuweisen
Wenn Du die Werte immer in der gleichen Reihenfolge in die Datei schreibst, kannst Du Dir die Variablennamen sparen.
Sollen es alles ganzzahlige Werte bis 256255 (Byte) sein oder doch eher int (32Bit aus ESP)?
Evtl. könnte man mit mehr Infos über die Randbedingungen über ein Array nachdenken.

Wenn es nicht menschenlesbar sein muss, könnte man auch eine Struktur binär abspeichern.

Gruß Tommy

Edit: Du solltestt auch prüfen, ob das open erfolgreich war.

"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
21.07.2021, 17:03
Beitrag #3
RE: C++ Frage: Parameter in TXT-File speichern, auslesen und variable zuweisen
(21.07.2021 16:41)Tommy56 schrieb:  ...
Sollen es alles ganzzahlige Werte bis 256 (Byte)...

[korrinthmodus] es sind zwar 256 Werte wenn man die 0 mitzählt....aber der Höchstwert bei Byte ist 255 Wink
[/korinthmodus]
lgbk


An alle Neuankömmlinge hier, wenn ihr Code(Sketch) hier posten wollt dann liest euch bitte diese Anleitung durch.

Ich spreche fließend Schwäbisch, Deutsch das Notwendigste und für die Begriffsstutzigen erprobtes Tacheles mit direkten Hinweisen ohne Schnörkel...

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
21.07.2021, 17:04
Beitrag #4
RE: C++ Frage: Parameter in TXT-File speichern, auslesen und variable zuweisen
Wo Du Recht hast, hast Du Recht.

Gruß Tommy

"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
21.07.2021, 18:26
Beitrag #5
RE: C++ Frage: Parameter in TXT-File speichern, auslesen und variable zuweisen
(21.07.2021 16:41)Tommy56 schrieb:  Sollen es alles ganzzahlige Werte bis 256255 (Byte) sein oder doch eher int (32Bit aus ESP)?

Die Werte können sowohl int, float oder auch String (oder besser ein char-array) sein, also sozusagen alles mögliche.

Bzgl. den Parameternamen:
Gibt es in C++ nicht evtl. auch die Möglichkeit, einen Variablennamen dynamisch anzusprechen?

In PHP kann ich ja z.B. folgendes machen:

Code:
<?php

$name1="Manfred";
$name2="Ulrike";

echo "Vorher:<br>".$name1."<br>".$name2."<br>";

$mein_array=array();
array_push($mein_array, array("parametername" => "name1", "parameterwert" => "Thomas"),array("parametername" => "name2", "parameterwert" => "Mike"));

foreach ($mein_array as $arr_element) {
    $parametername=$arr_element["parametername"];
    $$parametername=$arr_element["parameterwert"];
}

echo "Nachher:<br>".$name1."<br>".$name2;

?>

D.h. ich kann mir das if - then sparen.

Geht sowas in der Richtung auch mit C++?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.07.2021, 18:48
Beitrag #6
RE: C++ Frage: Parameter in TXT-File speichern, auslesen und variable zuweisen
Nö, das geht so in C++ nicht.
Wenn es alles mögliche sein kann, würde ich mit einer Struktur arbeiten. Da kannst Du zwar das File nicht zu Fuß lesen, es aber mit je 1 Zeile speichern und lesen.

Code:
// sinvolle Vorgaben für den ersten Start
struct dieStruktur {
  byte a = 10;
  char name[10] = "Paul";
  float gewicht = 88.6;
  int alter = 55;
}

dieStruktur einer;
...
einer.gewicht = 102.5;
const char fname[] = "datei.cfg";

int writeConfig(const char * filename, byte *config, uint16_t len) {
int res = 0;
  File f = LittleFS.open(filename, "w");
  if (f) {
    res = f.write(config,len);
    f.close();
  }
  return res;
}

// Liest Config. Return: Anzahl Bytes
int readConfig(const char * filename, byte *config, uint16_t len) {
int res;
  File f = LittleFS.open(filename, "r");
  if (f) {
    res = f.read(config,len);
    f.close();
  }
  return res;
}

...

// Schreiben:
int result writeConfig(fname,(byte*)&einer,sizeof(einer));
// lesen
int result readConfig(fname,(byte*)&einer,sizeof(einer));

So in der Art (ungetestet), wenn Du die Daten im LittleFS (Nachfolger vom SPIFFS) speichern willst. Beim ESP32 könnte es noch SPIFFS anstelle von LittleFS sein.

Gruß Tommy

"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
21.07.2021, 19:02
Beitrag #7
RE: C++ Frage: Parameter in TXT-File speichern, auslesen und variable zuweisen
(21.07.2021 18:48)Tommy56 schrieb:  Nö, das geht so in C++ nicht.
Wenn es alles mögliche sein kann, würde ich mit einer Struktur arbeiten. Da kannst Du zwar das File nicht zu Fuß lesen, es aber mit je 1 Zeile speichern und lesen.

Code:
// sinvolle Vorgaben für den ersten Start
struct dieStruktur {
  byte a = 10;
  char name[10] = "Paul";
  float gewicht = 88.6;
  int alter = 55;
}

dieStruktur einer;
...
einer.gewicht = 102.5;
const char fname[] = "datei.cfg";

int writeConfig(const char * filename, byte *config, uint16_t len) {
int res = 0;
  File f = LittleFS.open(filename, "w");
  if (f) {
    res = f.write(config,len);
    f.close();
  }
  return res;
}

// Liest Config. Return: Anzahl Bytes
int readConfig(const char * filename, byte *config, uint16_t len) {
int res;
  File f = LittleFS.open(filename, "r");
  if (f) {
    res = f.read(config,len);
    f.close();
  }
  return res;
}

...

// Schreiben:
int result writeConfig(fname,(byte*)&einer,sizeof(einer));
// lesen
int result readConfig(fname,(byte*)&einer,sizeof(einer));

So in der Art (ungetestet), wenn Du die Daten im LittleFS (Nachfolger vom SPIFFS) speichern willst. Beim ESP32 könnte es noch SPIFFS anstelle von LittleFS sein.

Gruß Tommy

OK, super Danke.
Es ist übrigens ein Wemos D1 Mini also ein ESP8266.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP32 Datei auf SD Karte durch Variable erstellen? Lor56 17 1.587 16.06.2021 13:40
Letzter Beitrag: hotsystems
  ESP8266, Frage zu Void Loop Bobo83600 3 644 04.05.2021 17:50
Letzter Beitrag: Tommy56
  Einer RGB-LED am ESP Werte aus MQTT zuweisen. Manny 2 675 15.04.2021 16:50
Letzter Beitrag: Manny
  ESP32 und Interrupts - ein Erfahrungsbericht - und eine Frage ;) MicroBahner 6 1.129 24.03.2021 09:18
Letzter Beitrag: MicroBahner
  433MHz Sendercode mit ESP-01 auslesen RaspiUser0815 36 5.815 27.02.2021 12:59
Letzter Beitrag: Vapalus
  Frage zu websocket-Problem amshh 4 749 25.01.2021 21:32
Letzter Beitrag: amshh
  Bester Weg um Sensordaten zu speichern und auszuwerten basementmedia 42 4.379 06.01.2021 23:45
Letzter Beitrag: Tommy56
Smile Frage zu Millis im Loop - ESP32 Stargazer 5 1.505 27.12.2020 06:41
Letzter Beitrag: N1d45
  ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings ultralex 14 1.751 15.12.2020 14:00
Letzter Beitrag: Tommy56
  Frage zum D1 Mini ESP32 dnwalker 19 2.981 02.12.2020 21:22
Letzter Beitrag: nbk83

Gehe zu:


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