c - fopen() 在 SD 卡上写入时返回无效参数?

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

我尝试将文件名中的 : 更改为 -。这导致错误更改为 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;
    }
}

最佳答案

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

如果将格式字符串中的:替换为-,那么它应该也可以在SD卡上工作。

关于c - fopen() 在 SD 卡上写入时返回无效参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49402992/

相关文章:

linux - 如何更改 gcc 手册页的默认版本?

linux - 显示.im6 : no decode delegate for this image format `/tmp/magick-KFcbfWUi'

powershell - 使用powershell删除所有文件并保持最新

java - 在Java中从输入文本文件中的字符串中分离单词并将其逐行打印到输出文本文件

java - 通过java程序从Linux服务器读取文件

c - 如何在磁盘 block 中一致地存储索引

c - 在 OpenMP 的并行区域内调用 exit() 是一种不好的做法吗?

c - 使用 scanf 选择性输入

C - 将 char 数组转换为小写

linux - 在 linux 64 位下链接 32 位库