Skip to content
Advertisement

fopen() returns inavlid argument when writing on SD card?

I’m trying to write a file on SD card if it’s inserted into the kit. Otherwise, the file should be written to the current directory of the project.

I can write the file in the project’s directory without any problems. However, when I try to write it on the inserted SD card, it returns Invalide argument!

FILE* open_file(void)
{
    char filename[40];
    struct tm *timenow;
    time_t now = time(NULL);

    if(card_inserted())
    {
        // Write to a file in the SD card
        if(!card_mounted())
        {
            system("mount /dev/mmcblk0p1 /media/sdcard/");
        }

        // Change directory from the project's dir to the SD card dir
        chdir("/media/sdcard/");
    }

    timenow = gmtime(&now);

    strftime(filename, sizeof(filename), "logs/data_%Y-%m-%d_%H:%M:%S.txt", timenow);

    // Open a file to save the received data in (appending mode)
    FILE *f = fopen(filename, "w"); 
    if (f == NULL)
    {
        perror("Error opening file!n");
        abort();
    }

    return f;
}

I tried changing the :s into -s in the file name. This caused the error to change to Input/output error.

I also tried not to use chdir(). Instead, to directly do the following:

strftime(filename, sizeof(filename), "/media/sdcard/logs/data_%Y-%m-%d_%H-%M-%S.txt", timenow);

This didn’t solve the problem -> Invalid argument.

I’m sure that the SD card is mounted to /media/sdcard/ and I can create a file into it using the terminal without any problem.

What can cause this error and how to solve it?

UPDATE

I made sure that the SD card is correctly mounted before running the program. This didn’t solve the problem.

Besides, when I try to write the file into SD card with a normal name, and not the current data and time, it works without any problems!!

Following is my updated code:

FILE* open_file(void)
{
    struct tm *timenow;
    time_t now = time(NULL);

    if(card_inserted() &&  write_to_card)
    {
        char *filename;
        filename = "/media/sdcard/logs/data.txt";

        FILE *f = fopen(filename, "w"); 
        if (f == NULL)
            pabort("Error opening file!n");

        return f;
    }
    else
    {
        char filename[40];
        timenow = gmtime(&now);
        strftime(filename, sizeof(filename), "logs/data_%Y-%m-%d_%H:%M:%S.txt", timenow);

        FILE *f = fopen(filename, "w"); 
        if (f == NULL)
            pabort("Error opening file!n");

        return f;
    }
}

Advertisement

Answer

The SD card is probably using a FAT/NTFS file system and filenames in a FAT/NTFS file system cannot contain the : character (and a few others).

If you replace the : in the format string by -, then it should work also on the SD card.

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement