Как распределить имена файлов по массивам

sauges
Offline
Зарегистрирован: 16.05.2015

Привет всем.

подскажите пожалуйста как распределить файлы находящиеся на sd card по массивам

к примеру если имя начинается с буквы A то это имя сохранить в одном массиве,

если с буквы B то в другом массиве

inspiritus
Offline
Зарегистрирован: 17.12.2012

Вам код написать?

и что собственно сохранять имя файла или содержимое. 

Массивы вообщетто в оперативке. Места мало.

sauges
Offline
Зарегистрирован: 16.05.2015
#include <SD.h>

void setup()
{
  char *dir; // массив для считывание имен
  char one[]={};
  char two[]={};
  char three[]={};
  char four[]={};
  char five[]={};
  char six[]={}; // массивы для разделения файлов

  Serial.begin(9600);
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  File root = SD.open("/");
  while(true)
  {
    File entry =  root.openNextFile();
    if (! entry) break;
    dir = entry.name();

      if(dir[0] == 'A'){
    one= ****;
    }
      if(dir[0] == 'B'){
    two= ****;
    }
      if(dir[0] == 'C'){
    three= ****;
    }
      if(dir[0] == 'D'){
    four= ****;
    }
      if(dir[0] == 'F'){
    five= ****;
    }
      if(dir[0] == 'E'){
    six= ****;
    }

    entry.close();
  }
  root.close();
}

void loop()
{
}

вот что то вродебы получилось

тут в местах где звездочки нужно написать что-то чтоб в масиве оказалось имя файлы

у которых первая буква A или B и так далее

имею вот такие файлы на sd card 

Afile.TXT
Bfile.TXT
Cfile.TXT
Dfile.TXT
Ffile.TXT
Efile.TXT
Afile2.TXT
Bfile2.TXT
Cfile2.TXT
Dfile2.TXT
Ffile2.TXT
Efile2.TXT

как это зделать???

sauges
Offline
Зарегистрирован: 16.05.2015

имя файлов

sauges
Offline
Зарегистрирован: 16.05.2015
#include <SD.h>
void setup()
{
  int i = 0;
  int k = 0;
  char *buffer;
  char *array[]={};
  char *name;
  char *dir;
  char *one[]={};
  char *two[]={};
  Serial.begin(9600);
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  File root = SD.open("/");
  while(true)
  {
    File entry =  root.openNextFile();
    if (! entry) break;
    dir = entry.name(); //чтение файлов с sd card
    array[i++] = dir;
         k=2;
    buffer=strtok(array[k],","); //разбиение этих файлов
     while(buffer!=NULL){
      name = array[k];

      if(name[0] == 'A'){
      while(buffer!=NULL){
      one[0] = array[k];
      }
    }
    if(name[0] == 'B'){
      while(buffer!=NULL){
      two[0] = array[k];
      }
    }

     }
    entry.close();
  }
  root.close();
}

void loop()
{
}

сегодня пытался доделать не получается 

все файлы сохраняются в массивах (one и two)

я кажется ошибку допустил здесь

     if(name[0] == 'A'){
      while(buffer!=NULL){
      one[0] = array[k];
      }
    }
    if(name[0] == 'B'){
      while(buffer!=NULL){
      two[0] = array[k];
      }
    }

 

Datak
Offline
Зарегистрирован: 09.10.2014






String one;
String two;
.....
.....

if( name[0] == 'A' )
{
   if( one != "" ) one += ",";

   one += name;
}
.....

Не проверял, но попробуйте как-нибудь так. Вы же, чувствуется, во всех этих строках не очень специалист, так что через String будет проще.

sauges
Offline
Зарегистрирован: 16.05.2015

Datak пишет:







String one;
String two;
.....
.....

if( name[0] == 'A' )
{
   if( one != "" ) one += ",";

   one += name;
}
.....

Не проверял, но попробуйте как-нибудь так. Вы же, чувствуется, во всех этих строках не очень специалист, так что через String будет проще.

как вы сказали я попробовал но не чего не изменилось

который вы написали пример который я написал там в обоих 

не сортируются имена я хотел чтоб если имя начинается с A то его сохранить в одном массиве

если с B то в другом, а в даных кодах они сохраняются там и там (в обоих массивах)

 

sauges
Offline
Зарегистрирован: 16.05.2015

#include <tinyFAT.h>
#include <avr/pgmspace.h>

byte initres;
byte res;
String one;
String two;

void setup() {
  Serial.begin(9600);
  initres=file.initFAT();   
}

void loop() {
      res = file.findFirstFile(&file.DE);

      if (res==NO_ERROR)
      {
        two += file.DE.filename;
      }

      while (res==NO_ERROR)
      {
        res = file.findNextFile(&file.DE);
        if (res==NO_ERROR)
        {
          one += file.DE.filename;
        }
     }
}

сегодня попытался сделать по другому и с другой библиотекой

здесь в масиве one сохраняются имена файлов но они сохранены по символам

как их обьединить в слово

sauges
Offline
Зарегистрирован: 16.05.2015

?

uzverrk
Offline
Зарегистрирован: 10.06.2015

может сначала блок схемму нарисуешь?

пока что то что ты генерируешь вообще непохоже на обдуманный код

т.е. чтото из серии

1. найти файл

2.если найден то

 2а. считать имя

 2б. если имя файла кошерное то

   2ба. намазать сметаной

 2в. если имя файла постное то

   2ва. жахнуть

3. вернуться к 1.

sauges
Offline
Зарегистрирован: 16.05.2015

1. найти файл

2.если найден то

 2а. считать имя и записать в массив

3. вернуться к 1.

и все

sauges
Offline
Зарегистрирован: 16.05.2015

с именим ничего не надо делать только сохранить в массиве

 

uzverrk
Offline
Зарегистрирован: 10.06.2015

именно в этом и есть твой косяк! если ты не можешь представить пошагово последовательность действий то и программу ты не сможешь написать.

считать имя файла  это один из пунктов, второй это как ты в начале писал, разсовать по разным массивам, третье минимум условие выхода из цикла.

разберу просто пару ошибок кода:

void setup()
{
  char *dir; // массив для считывание имен
 здесь ты обьявил не массив!!!
      if(dir[0] == 'A'){

    one= ****;


а здесь ты обращаешся к переменной как к массиву, причем только к элементу номер [0], и пытаешься записать данные в ранее обьявленный массив, но обращение как к переменной, при повторном обращении есть шанс утерять предыдущую информацию.

пока не поймешь ошибку на этапе алгоритмизации, врядли что получится.

Datak
Offline
Зарегистрирован: 09.10.2014



#include <tinyFAT.h>
#include <avr/pgmspace.h>

byte initres;
byte res;
String one;
String two;

void setup(){
  Serial.begin(9600);
  initres=file.initFAT();   
}

void loop( ) 
{
   res = file.findFirstFile( &file.DE );
  
   while( res == NO_ERROR )
   {
      String* pStr = NULL;

      switch( file.DE.filename[0] )
      {
         case 'A': pStr = &one; break;
         case 'B': pStr = &two; break;
      }

      if( pStr != NULL )
      {
         if( *pStr != "" ) { *pStr += ","; }

         *pStr += file.DE.filename;
      }

      res = file.findNextFile( &file.DE );
   }

   Serial.println( one );
   Serial.println( two );
}

Конечно компилить не пробовал, но что-то такое должно получиться.

sauges
Offline
Зарегистрирован: 16.05.2015

большое всем спасибо за помощь

 

#include <SD.h>

char *dir;
String A[20];
String B[20];
int k = 0;
int j = 0;

void setup()
{
  Serial.begin(9600);
  SD.begin(10);

  File root = SD.open("/");
  while(true)
  {
    File entry =  root.openNextFile();
    if (! entry) break;

    dir = entry.name();
 String* pStr = NULL;
 switch( dir[0] )
   {
     case 'A': pStr = &A[k++]; break;
     case 'B': pStr = &B[j++]; break;
   }
   
  if( pStr != NULL )
      {
      *pStr += entry.name();
      }
    entry.close();
  }
  root.close();
}

void loop()
{
  Serial.println(A);
}

 

вот окончательный код 

оказывается все было в том что я писал String A вместо String A[20]

не указывал вообше что это массив (или его размер)

Datak
Offline
Зарегистрирован: 09.10.2014

case 'A': A[k++] = dir; break;

Так тогда уж - зачем теперь этот pStr.

sauges
Offline
Зарегистрирован: 16.05.2015

))) я вообше убрал распределение по массивам 

не думал но она память просто схавала