在SD卡上写入时fopen()返回inavlid参数?

时间:2018-03-21 09:50:04

标签: c linux file fopen

我正在尝试在SD卡上写入文件,如果它已插入套件中。否则,应将该文件写入项目的当前目录。

我可以毫无问题地在项目目录中编写该文件。 但是,当我尝试在插入的SD卡上写入时,它会返回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;
}

我尝试将:更改为文件名中的- s。这导致错误更改为Input/output error

我也尝试过不使用chdir()。相反,要直接执行以下操作:

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

这没有解决问题 - > Invalid argument

我确定SD卡已安装到/media/sdcard/,我可以使用终端创建一个文件,没有任何问题。

什么可能导致此错误以及如何解决?

更新

我确保在运行程序之前正确安装了SD卡。这并没有解决问题。

此外,当我尝试将文件写入普通名称的SD卡,而不是当前的数据和时间时,它没有任何问题!

以下是我更新的代码:

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;
    }
}

1 个答案:

答案 0 :(得分:4)

SD卡可能正在使用FAT / NTFS文件系统,FAT / NTFS文件系统中的文件名不能包含:字符(以及其他一些字符)。

如果您将格式字符串中的:替换为-,那么它也可以在SD卡上使用。