Creating a file name from GPS date for SD Card

I have a project that requires a large amount of data. I want to create a new file each day using the parsed GPS date.
the following is a snippet of my code.

fileName +=;
fileName += "";
fileName += GPS.month;
fileName += "
fileName += GPS.year;
fileName += ".csv" ;
File dataFile =, FILE_WRITE);

when I print using Serial.println(fileName); I get 20_1_13.csv

but I get an error using the above code.

datacollector.ino: In function 'void loop()':
datacollector:185: error: no matching function for call to 'SDClass::open(String&, int)'
C:\Users\Herb\Desktop\arduino-1.0.3\libraries\SD/SD.h:74: note: candidates are: File SDClass::open(const char*, uint8_t)

any suggestions?

any suggestions?

Yes. Don't use Strings.

Or, if you insist on shooting yourself in the foot anyway, read the error message. It's telling you that the open() method does not have an overload that takes a String. It has one that takes a const char *. So, look at the documentation for the String class and see how you can get a const (or not) char * from the String instance.

sprintf() would be a far better choice.

Declare fileName as an array of characters and then

sprintf(fileName, "%02d_%02d_%02d.csv",, GPS.month, GPS.year);

Better still would be to use a format like

sprintf(fileName, "%02d%02d%02d.csv", GPS.year, GPS.month,;

because it sorts the files in ascending order when listed rather than day of the month (not too usefule when you have lots of months).

I don’t use GPS for it, but the compilation of the name would be the same. I use an If then to change it on the first loop after midnight.

#include <SD.h>
#include "RTClib.h"
#include <Wire.h>
#include <string.h>

char filename[] = "00000000.CSV";
File myFile;

void setup()
Wire.begin(); //Important for RTClib.h

if (! RTC.isrunning()) {

Serial.println("RTC is NOT running!");

Serial.print("Initializing SD card...");

pinMode(10, OUTPUT);

if (!SD.begin(4)) {
Serial.println("initialization failed!");
Serial.println("initialization done.");

void loop()


void getFileName(){

DateTime now =;

filename[0] = (now.year()/1000)%10 + '0'; //To get 1st digit from year()
filename[1] = (now.year()/100)%10 + '0'; //To get 2nd digit from year()
filename[2] = (now.year()/10)%10 + '0'; //To get 3rd digit from year()
filename[3] = now.year()%10 + '0'; //To get 4th digit from year()
filename[4] = now.month()/10 + '0'; //To get 1st digit from month()
filename[5] = now.month()%10 + '0'; //To get 2nd digit from month()
filename[6] = + '0'; //To get 1st digit from day()
filename[7] = + '0'; //To get 2nd digit from day()
//filename[8] = filename + ".csv";

void createFileName(){
myFile =, FILE_WRITE);

I was just running into this problem too. I got that it was the string that was throwing it all off, but without your help, I wouldn't have known about sprintf(). Thanks! I'm gonna look that one up right now as well as the const char one for string.