【问题标题】:File System Open Files Randomly文件系统随机打开文件
【发布时间】:2021-08-03 00:20:06
【问题描述】:

我的一个客户要求我播放 SD 卡中的声音。但是文件选择应该是随机的,因为该设备是用来吓唬野外的动物(动物不应该习惯于声音模式)。我可以通过

生成随机数
void RNG_Generate_Numbers()
{
    HAL_RNG_GenerateRandomNumber(&hrng, &random_number.random_number1);
    HAL_RNG_GenerateRandomNumber(&hrng, &random_number.random_number2);
}

我可以通过

来统计文件
void File_Find_File(file_manager_t *file_manage)
{

    file_manage->file_result = f_readdir(&file_manage->file_direction, &file_manage->file_info);

    if( (file_manage->file_result != FR_OK) || (file_manage->file_info.fname[0] == '\0')  )
    {
        file_manage->file_counter = 0;
    }
    else
    {
    ++file_manage->file_counter;
    }

}

到这里为止一切都很好。但是当涉及到随机选择文件时,我找不到任何方法来做到这一点。任何帮助表示赞赏。

编辑:这是file_manager结构;

typedef struct __file_manager /* struct tag */
{
FATFS drive_handler;
FIL file_handler;
FRESULT file_result;
uint8_t file_disk_status;
DIR file_direction;
FILINFO file_info;
uint8_t file_rx_buffer[512];
char file_current_dir[256];
uint32_t file_bytes_read;
uint32_t file_bytes_write;
size_t file_counter;
}file_manager_t ;

【问题讨论】:

  • 有什么理由不能将所有文件塞进一个目录并重命名它们?如果答案是否定的,只需重命名文件,使文件名是数字序列并使用sprintf(file_name, "%d.mp3", rand() % n_files),或在您的系统上最接近该方法的任何内容。
  • 这可能是特定于操作系统和特定于硬件的。
  • 它是基于 MCU 的应用程序。系统上没有操作系统。我正在使用FATFS来操作文件系统。
  • @Paul 我几乎也是这么想的。但是音频文件是由用户决定的,用户容易出错……
  • 这么多的可能性!保罗的建议是最简单的。如果您有足够的 RAM,则加载所有名称并从该列表中选择。如果你的sd卡很快,那么每次做reservoir sampling

标签: c algorithm random filesystems


【解决方案1】:

最简单的解决方案是将所有文件移动到一个目录中,并按从零开始的顺序命名每个文件。获取一个随机文件名就很简单了:

sprintf(file_name, "%d.mp3", rand() % my_files);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 2021-03-02
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多