SPIFFS: string --> const char

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

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

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:

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

Leider mag der SPIFFS Append keine Strings :wink:

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

Stringvariable.c_str()

Gruß Tommy

Tommy56:

Stringvariable.c_str()

Gruß Tommy

:slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile:

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

DANKE für die Hilfe !!!

:slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile:

reviewmedia:

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

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 :wink:

  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…

Du könntest die Funktion appendFile() auch überladen, so dass sie String als Parameter nimmt.

combie:
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!

combie:
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:

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

Wäre das dann so, als neue Funktion in der lib:

Ja, so in etwa…

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.

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.