RTC Daten als Logname für SD Card

Hallo habe eine Frage
wenn ich (rtc.getminute)),(rtc.gethour)),(rtc.getday)),(rtc.getmonth)) in variablen einlese,
wie kann ich die 4 zusammen verknüpfen um sie gemeinsam als logname auf eine SD Karte zu schreiben ?.
MfG John

z.B. mit sprintf kannst du mehrere Variable in einen gemeinsamen Text schreiben:

char filename[12];
sprintf(filename,"%02d%02d%02d%02d.log", rtc.getmonth(), rtc.getday(), rtc.gethour(), rtc.getminute() ); // ein 8.3 Name wie z.B.  "06032345.log"
Serial.println(filename);

michael_x:
z.B. mit sprintf kannst du mehrere Variable in einen gemeinsamen Text schreiben:

char filename[12];

sprintf(filename,"%02d%02d%02d%02d.log", rtc.getmonth(), rtc.getday(), rtc.gethour(), rtc.getminute() ); // ein 8.3 Name wie z.B.  "06032345.log"
Serial.println(filename);

Vorsicht, bei Verwendung von char-Arrays aber immer darauf achten, dass keine Puffer-Überläufe entstehen können, bei denen über das Ende eines Puffers hinausgeschrieben wird.

Mit der gegen Pufferüberläufe sicheren Funktion "snprintf()" statt "sprintf()" bei korrekter Übergabe der Pufferlänge:

snprintf(filename,sizeof(filename),"%02d%02d%02d%02d.log", rtc.getmonth(), rtc.getday(), rtc.gethour(), rtc.getminute() ); // ein 8.3 Name wie z.B.  "06032345.log"

würde man direkt bei der Ausgabe des so erzeugten Dateinamens sehen: Die Variable "filename" ist um ein Zeichen zu kurz deklariert und muss ein

char filename[13];

sein (8 Zeichen vor dem Punkt, 1 Zeichen Punkt, 3 Zeichen nach dem Punkt, 1 Zeichen Nullzeichen für Stringende beim char-Array = 13).

Versehentlich auftretende Pufferüberläufe in komplexen Programmen können - teils erst etliche hundert Programmzeilen später oder nur gelegentlich bei längeren Programmlaufzeiten - zu unerklärlichen Fehlern im Programmablauf führen, die man dann später nur schwer finden kann.

Sehr gut gesehen,jurs. Mein Irrtum.

(8 Zeichen vor dem Punkt, 1 Zeichen Punkt, 3 Zeichen nach dem Punkt, 1 Zeichen Nullzeichen für Stringende beim char-Array = 13).

Was passiert bei snprintf (buf,12,format, ... ) ?
Wird auf buf[11] eine 0 geschrieben ? "06041234.lo"
Oder fehlt die Abschluss-Null ? "06041234.log°ä...."

Die Dokumentation ist mir unklar : Hier im mikrocontroller Forum wird behauptet die 0 fehlt,
diese Referenz behauptet, es werden 11 Zeichen + '\0' ausgegeben.

Eigentlich egal, wenn man es richtig macht, gehts !

michael_x:
Was passiert bei snprintf (buf,12,format, ... ) ?
Wird auf buf[11] eine 0 geschrieben ? "06041234.lo"
Oder fehlt die Abschluss-Null ? "06041234.log°ä...."

Die Dokumentation ist mir unklar : Hier im mikrocontroller Forum wird behauptet die 0 fehlt,
diese Referenz behauptet, es werden 11 Zeichen + '\0' ausgegeben.

Die Referenz ist richtig.

Mit der "sicheren" Funktion snprintf wird nicht nur dafür gesorgt, dass nicht über das Pufferende hinausgeschrieben wird, sondern es wird auch dafür gesorgt, dass der String korrekt mit dem Nullzeichen \0 beendet wird, notfalls als letztes Zeichen im Puffer, so dass der String in jedem Fall nur die maximale Länge "Pufferlänge minus 1" erreichen kann.

Zum Testen einfach mal die Variable aus-Xen und ausgeben: Überal X drin
Dann den (nicht ganz hineinpassenden) Dateinamen mit snprintf in den zu kurzen Puffer schreiben
Nochmal ausgeben: Letztes Zeichen ist \0 statt X - und der Dateiname um ein Zeichen zu kurz geraten, aber es wurde nicht über das Pufferende hinaus geschrieben.

void setup() {
  Serial.begin(9600);
  char filename[12];
  memset(filename,'X',sizeof(filename));
  for (int i=0;i<sizeof(filename);i++)
  {
    if (i<10) Serial.print(' ');
    Serial.print(i);
    Serial.print(' ');
    Serial.print(filename[i]);
    Serial.print(' ');
    Serial.print(byte(filename[i]));
    Serial.println();
  }
  snprintf(filename,sizeof(filename),"%02d%02d%02d%02d.log", 6,4,21,20 ); // ein 8.3 Name wie z.B.  "06032345.log"
  Serial.println();
  Serial.println(filename);
  for (int i=0;i<sizeof(filename);i++)
  {
    if (i<10) Serial.print(' ');
    Serial.print(i);
    Serial.print(' ');
    Serial.print(filename[i]);
    Serial.print(' ');
    Serial.print(byte(filename[i]));
    Serial.println();
  }
}

void loop() {
}