Go Down

Topic: SPIFFS: string --> const char  (Read 141 times) previous topic - next topic

reviewmedia

Hallo, waaah ich komme mit dem Konzept von string und char noch nicht ganz klar ;)

SPIFFS erwartet const char (ich denke die Funktion kennen die meisten):       

Code: [Select]
void appendFile(fs::FS &fs, const char * path, const char * message){
    File file = fs.open(path, FILE_APPEND);
    file.print(message);
}


Ich möchte folgendes reinschreiben:

Code: [Select]
output[6] = String(SHT_C) + ";" + String(SHT_H) + ";" + String(DS18_C) + "\r\n";


Leider mag der SPIFFS Append keine Strings ;)

Wie wandle ich einen String mit variabler Länge in das geforderte const char?

Tommy56

Code: [Select]
Stringvariable.c_str()

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

reviewmedia

Code: [Select]
Stringvariable.c_str()

Gruß Tommy
:)  :)  :)  :)  :)  :)  :)

appendFile(SPIFFS, "/data1.csv",output[6].c_str());


DANKE für die Hilfe !!!


 :)  :)  :)  :)  :)  :)  :)

Derfips

#3
Jun 12, 2019, 08:17 pm Last Edit: Jun 12, 2019, 08:18 pm by Derfips
Code: [Select]
output[6] = String(SHT_C) + ";" + String(SHT_H) + ";" + String(DS18_C) + "\r\n";

Sowas geht mit "file.printf(" %.2f; oder %.2d;...... je nach Format deinerSHT_

http://www.cplusplus.com/reference/cstdio/printf/


Gruß Fips
Meine Esp8266 & ESP32 Projekte => https://fipsok.de

reviewmedia

#4
Jun 12, 2019, 08:22 pm Last Edit: Jun 12, 2019, 08:24 pm by reviewmedia
Hier nochmal die Übersicht (mit serieller Ausgabe) falls jemand auch Probleme damit hat...

Das Problem war die Übergabe des zusammengebauten Strings an file.print()
file.print() erwatet const char und mit stringvaribale.c_str() ist das Problem gelöst.

In meinem Fall schreibe ich die Messwerte mit einer gerundeten Nachkommastelle in eine Datei die Später per Handy (Wifi/Webbrowser) gelesen, verschickt, gedruckt wird. ESP32 sei Dank ;)


Code: [Select]
  String output [7];

  ...

  if(!SPIFFS.exists("/data.csv")){
    writeFile(SPIFFS, "/data.csv", "SHT_C;SHT_H;DS18_C\r\n");
  }

  output[6] = String(SHT_C) + "." + String(SHT_C2) + ";" + String(SHT_H) + "." + String(SHT_H2) + ";" + String(DS18_C) + "." + String(DS18_C2) + "\r\n";

  appendFile(SPIFFS, "/data.csv",output[6].c_str());

  ...

  void appendFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Appending to file: %s\r\n", path);

    File file = fs.open(path, FILE_APPEND);
    if(!file){
        Serial.println("- failed to open file for appending");
        return;
    }
    if(file.print(message)){
        Serial.println("- message appended");
    } else {
        Serial.println("- append failed");
    }
  }



PS: Danke Fips, werd ich mir ansehen...

combie

Du könntest die Funktion appendFile() auch überladen, so dass sie String als Parameter nimmt.
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

reviewmedia

Du könntest die Funktion appendFile() auch überladen, so dass sie String als Parameter nimmt.
äh ja, bin gar nicht daruf gekommen das in die Append File zu packen,
ich wollte eh die serielle Ausgabe rausmachen... nice!

Danke!




ElEspanol

#7
Jun 13, 2019, 09:52 am Last Edit: Jun 13, 2019, 09:53 am by ElEspanol
Du könntest die Funktion appendFile() auch überladen, so dass sie String als Parameter nimmt.
Nur so aus Neugier, ich hab noch nie was überladen, ausser mein Auto.
Wäre das dann so, als neue Funktion in der lib:

Code: [Select]
void appendFile(fs::FS &fs, const char * path, const String * message){
   File file = fs.open(path, FILE_APPEND);
   file.print(message);
}

combie

#8
Jun 13, 2019, 10:20 am Last Edit: Jun 13, 2019, 11:46 am by combie
Quote
Wäre das dann so, als neue Funktion in der lib:
Ja, so in etwa....


Code: [Select]
void appendFile(fs::FS &fs, const char * path, const char * message)
{
    File file = fs.open(path, FILE_APPEND);
    file.print(message);
}

void appendFile(fs::FS &fs, const char * path, String &message)
{
    File file = fs.open(path, FILE_APPEND);
    file.print(message);
}


So müsste es funktionieren. (nicht getestet, aber der C++Standard gibt es her)
Die beiden Funktionen kommen sich nicht ins Gehege, dürfen also in der gleichen Datei stehen.


Alternativ: (die deutlich flexiblere Variante)
Eine Erzeugungsvorschrift für überladenen Funktionen, welche welche dann vom Kompiler selber generiert werden.
Code: [Select]
template<typename Type> void appendFile(fs::FS &fs, const char * path, Type &message)
{
    File file = fs.open(path, FILE_APPEND);
    file.print(message);
}

auch ungetestet.
Dem kann man dann auch alles übergeben, was das Printable Interface implementiert.
Könnte eine Hilfe sein.....

Vorteile/Nachteile muss man abwägen.

> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Go Up