SD поиск строки в файле

Тема в разделе "Arduino & Shields", создана пользователем one_player, 2 дек 2016.

Метки:
  1. one_player

    one_player Нерд

    Добрый день/вечер.
    Подскажите как сделать поиск строки в фале на SD карте.
    Т.е. есть файл file.txt в нем записаны с новой строки данные
    name
    name1
    name2
    name3
    ......
    nameN
    Необходимо в этом файле находить строку с определенным "nameN".
    Также вопрос SD.h как оказывается не работает с файлами имена которых больше 8 символов + 3 на расширение. А так же с файлами в имени которых есть цифры. Почему так и как это обойти?
     
  2. AlexVS

    AlexVS Гик

    Ну алгоритм поиска вроде как очевиден, необходимо построчное считывание из файла и сравнение с шаблоном поиска. А что дальше нужно, после того как нашли нужную строку?
    По поводу цифр в имени файла - это не верная информация, у меня файлы логов именуются как YYYMMDD.txt (например 20161203.txt). По поводу 8+3 - видимо придется самостоятельно переписать часть библиотеки, ну или найти такую, в которой реализована поддержка длинных имен.
     
  3. one_player

    one_player Нерд

    Ну вот есть такой код
    Код (C++):
    #include <SD.h>
    #include <SPI.h>
    File printFile;
    String bufs;
    String buf = "14";
    boolean SDfound;
    void setup() {
      Serial.begin(9600);
      if (SDfound == 0) {
        if (!SD.begin(8)) {
          Serial.print("SD not found");
          while(1);
        }
      }
    }
    void loop() {
      SDfound = 1;
      printFile = SD.open("id.txt");

      if (!printFile) {
        Serial.print("file cannot be opened");
        while(1);
      }
      while (printFile.available()) {
        bufs = printFile.readStringUntil('\n');
        Serial.println(bufs); //Вывод строки
        if (bufs == buf)// Если Строка bufs == переменной buf то выводим Yes!
        {
          Serial.println("Yes!");
        }
        delay(2000);      
      }
      printFile.close();
      delay(2000);
    }
    Файл id.txt на SD карте содержит цифры от 1 до 20 каждая цифра с новой строки.
    Приведенный код работает отлично в сериал передает все эти цифры как и хотелось.
    Но вот кусок
    Код (C++):
        if (bufs == buf)// Если Строка bufs == переменной buf то выводим Yes!
        {
          Serial.println("Yes!");
        }
    По какой то причинен НЕ проверяет равенство этих строк.
    Почему? Где ошибка? Ведь теоретически все должно работать без проблем.
     
  4. rkit

    rkit Гуру

    Что теоретически, что практически, сравнение указателей проверяет равенство указателей. А строки сравнивают с помощью strcmp()
     
  5. one_player

    one_player Нерд

    А можно чуть подробнее в чем моя ошибка ?
     
  6. rkit

    rkit Гуру

    Это все было уже тысячу раз написано до меня, и едва ли у меня получится лучше.
    Почитайте, что такое строка в C. Да и весь остальной учебник тоже не помешает.
     
  7. one_player

    one_player Нерд

    И так. Заменил.
    Код (C++):
    if (bufs == buf)// Если Строка bufs == переменной buf то выводим Yes!
        {
          Serial.println("Yes!");
        }
    На такой костыль.
    Код (C++):
    bufs.trim();
        if (bufs.compareTo(buf)== 0)
        {
          Serial.println("Ok");
          break;
        }  
    Функция trim() удаляет лишние пробелы в конце переменной String.
    После функцией сравнения переменных типа String compareTo() которая в случае совпадения по алфавитно содержимого этих переменных возвращает "0" проверяю свои переменные.
    Возможно все это костыль, возможно можно было и проще сделать.