2014-10-28 11 views
0

프로그래밍 마이크로 컨트롤러를 처음 사용하는데 문제가 있습니다.C에서 dirent.h를 사용하여 파일 읽기 및 선택

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이 char 배열 (예 : '문자열')에 대한 포인터 인 정보를 읽을 수 있습니다. 그런 다음 버튼 누름을 감지하는 코드와 함께 구조체를 사용하여 배열 정보로 위 또는 아래로 인덱스를 이동합니다 (더 크거나 작은 인덱스로 인덱스가 범위 나 구조체를 벗어나지 않는지 확인하십시오). 또는 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은 이름입니다. 버튼 누름은 원하는 이름을 식별하는 이름 배열로 색인을 증가/감소시킬 수 있습니다. 이러한 이름 중 일부는 파일 이름이 아닌 디렉토리 이름 일 수 있습니다.

틀림없이 이것은 고정 된 값을 사용하는 대신 배열을 할당하는 것입니다 (실제로 'names'배열을 호출 함수에 전달해야하는 경우). "secure "strcpy (메모리 오버 플로우 손상 방지에 도움이되는 버전) 등이 있지만 메모리에 이름을 유지하는 방법에 대한 아이디어를 제공해야합니다.

+0

그래, 일단 내가 어떻게 각 프로그램의 색인을 얻을 프로그램을 알아 냈어. 하지만이 색인을받는 데 문제가 있습니다. 각 파일의 색인을 얻는 방법을 설명 할 수 있다면 정말 고맙겠습니다. 나는 그 밖의 무엇을 시도 해야할지 아이디어가 부족합니다 ... – Scura

+0

내용을 확장하기 위해 답변을 업데이트했습니다 – Dweeberly

+0

도움을 많이 주셔서 감사합니다. 비슷한 것을 시도했지만, 제대로하지 못했습니다. 어쨌든, 매력처럼 작동합니다. 도와 주셔서 감사합니다.:) – Scura