2014-10-28 4 views
0

Я новичок в программировании микроконтроллеров, и у меня есть проблема.Чтение и выбор файлов с использованием dirent.h в C

Я пытаюсь создать устройство, которое воспроизводит музыку с USB. Я могу читать с USB, но я понятия не имею, как выбрать определенный файл. Я использую dirent.

Мой код до сих пор:

while (true) { 
    USBHostMSD msd("usb"); 
    //setup PWM hardware for a Class D style audio output 
    PWMout.period(1.0/400000.0); 

    // wait until connected to a USB device 
    while(!msd.connect()) { 
     Thread::wait(500); 
    } 

    FILE *wave_file; 
    lcd.cls(); 
    lcd.locate(0,3); 


    DIR *dir; 
    struct dirent *ent; 
    int i=0; 
    int stevilo_datotek =0; 


    dir = opendir ("/usb/"); 
    if (dir != NULL) 
    { 


     while ((ent = readdir (dir)) != NULL) 
     { 
       lcd.printf ("%s\n", ent->d_name[0]); 
     } 
} 

Теперь этот код показывает, что на USB. Как я могу перемещаться по файлам на USB с помощью кнопок на устройстве? Я хотел бы знать, есть ли способ назначить определенную песню определенному числу, чтобы я мог перемещаться. Я изучил файл dirent.h так долго, и не могу найти, где dirent сохраняет файл (если он есть).

ответ

0

Возможно, вы сбиваете с толку цель dirent.h. Короче, может быть трудно увидеть лес для деревьев.

Вы можете прочитать информацию (ent-> d_name, отметить, что ent-> d_name является указателем на массив символов, часто называемый «строкой») в структуру данных (например, массив или список) затем используйте эту структуру с кодом, который обнаруживает нажатия кнопок, чтобы переместить индекс в информацию о массиве вверх или вниз (к большему или меньшему индексу, убедитесь, что ваш индекс не выходит за пределы диапазона или вашей структуры). Или вы можете создать код, в котором ваш цикл while будет нажат кнопку, и будет читать только имя файла (используя seekdir для возврата назад).

UPDATE (в ответ на комментарий): Имейте в виду, что файловые системы являются древовидные структуры, как так:

/ (root) +--- dir1 ----------------------------+- dir1.1 
     ---- dir2 (empty)      -- file1.1 
     ---- dir3 ---- dir3.1 +--- file3.1 
     ---- file1   ---- file3.2 
     ---- file2 

Вы должны решить, как справиться с этим, вы собираетесь только поддержку один каталог (заставьте их поместить все свои музыкальные файлы в одном месте), разрешить им перемещаться по каталогам или просматривать все каталоги, выбирая только файлы, которые вы знаете, как играть?

Нет наследования для файлов (или подкаталогов) и в некоторых системах файлы могут быть добавлены или удалены в любое время.

Вот очень простодушный пример одного из способов сохранить список записей каталога:

char *names[400]; // make space for 400 names 
int ix; 
ix = 0; 
if (dir != NULL) 
{ 
    while ((ent = readdir (dir)) != NULL) 
    { 
      lcd.printf ("%s\n", ent->d_name[0]); 
      // allocate memory to store the name 
      names[ix] = (char*) malloc(strlen(ent->d_name)); // strlen from string.h 
                  // malloc from stdlib.h 
      // copy the name from the directory entry 
      strcpy(names[ix], ent->d_name); // strcpy from string.h 
      ix++; 
      if (ix >= 400) 
      { 
       // do something because your array isn't big enough 
      } 
    } 
} 

Теперь у вас есть свои имена в «именах» массива и может обратиться к ним по индексу. Значение «ix-1» - ваше имя, 0 - ваше имя. Нажатие кнопок может увеличивать/уменьшать индекс в вашем массиве имен, который идентифицирует нужное имя. Имейте в виду, что некоторые из этих имен могут быть именами каталогов, а не именами файлов.

Понятно, что это просто, вы можете выделить массив, а не использовать фиксированное значение (на самом деле вам нужно, если вы хотите передать массив имен в вызывающую функцию), есть «безопасные «версии strcpy (предназначенные для предотвращения повреждения переполнения памяти) и т. д., но это должно дать вам представление о том, как сохранить имена в памяти.

+0

Да, я все выяснил, как программировать, как только я получу индекс каждого файла. Но у меня проблемы с получением этого индекса. Если бы вы могли объяснить, как я могу получить индекс каждого файла, я бы очень его оценил. У меня как бы заканчиваются идеи, что еще попробовать ... – Scura

+0

Я обновил ответ, чтобы расширить его содержимое – Dweeberly

+0

Большое спасибо за вашу помощь. Подобно тому, что я пытался самостоятельно, но я думаю, что я не делал этого правильно. Во всяком случае, работает как шарм. Спасибо за помощь.:) – Scura

Смежные вопросы