Добрый день/вечер. Подскажите как сделать поиск строки в фале на SD карте. Т.е. есть файл file.txt в нем записаны с новой строки данные name name1 name2 name3 ...... nameN Необходимо в этом файле находить строку с определенным "nameN". Также вопрос SD.h как оказывается не работает с файлами имена которых больше 8 символов + 3 на расширение. А так же с файлами в имени которых есть цифры. Почему так и как это обойти?
Ну алгоритм поиска вроде как очевиден, необходимо построчное считывание из файла и сравнение с шаблоном поиска. А что дальше нужно, после того как нашли нужную строку? По поводу цифр в имени файла - это не верная информация, у меня файлы логов именуются как YYYMMDD.txt (например 20161203.txt). По поводу 8+3 - видимо придется самостоятельно переписать часть библиотеки, ну или найти такую, в которой реализована поддержка длинных имен.
Ну вот есть такой код Спойлер: CODE Код (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 каждая цифра с новой строки. Приведенный код работает отлично в сериал передает все эти цифры как и хотелось. Но вот кусок Спойлер: CODE Код (C++): if (bufs == buf)// Если Строка bufs == переменной buf то выводим Yes! { Serial.println("Yes!"); } По какой то причинен НЕ проверяет равенство этих строк. Почему? Где ошибка? Ведь теоретически все должно работать без проблем.
Что теоретически, что практически, сравнение указателей проверяет равенство указателей. А строки сравнивают с помощью strcmp()
Это все было уже тысячу раз написано до меня, и едва ли у меня получится лучше. Почитайте, что такое строка в C. Да и весь остальной учебник тоже не помешает.
И так. Заменил. Спойлер: CODE Код (C++): if (bufs == buf)// Если Строка bufs == переменной buf то выводим Yes! { Serial.println("Yes!"); } На такой костыль. Спойлер: CODE Код (C++): bufs.trim(); if (bufs.compareTo(buf)== 0) { Serial.println("Ok"); break; } Функция trim() удаляет лишние пробелы в конце переменной String. После функцией сравнения переменных типа String compareTo() которая в случае совпадения по алфавитно содержимого этих переменных возвращает "0" проверяю свои переменные. Возможно все это костыль, возможно можно было и проще сделать.