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

genia1991
Offline
Зарегистрирован: 25.12.2019

добрый день. пытаюсь найти слово в txt файле но ничего не работает.

скетч такой использую. чтение с карты происходит через char а надо как то наверное сделать через string.

помогите исправить код. спасибо

  // re-open the file for reading:
  myFile = SD.open("text1.txt");
  if (myFile) {
    Serial.println("text1.txt:");

    // read from the file until there's nothing else in it:
   while(myFile.available()) {
      Serial.write(myFile.read());

      //--------------------ERROR---ERROR-------ERROR---------------------------------------
    char val=myFile.read();             
    if (val =="second")           //char переменная для символа одного. нужен string
     //--------------------------------------------------------------------------------------   
    {
           Serial.println("FOUND");
    }
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Вы в первый класс ходили? Учили Вас там искусству чтения слов по-буквам? Вот научите теперь МК тому же самому.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

genia1991 пишет:

добрый день.

Зравствуйте

genia1991 пишет:

пытаюсь найти слово в txt файле

В каком именно месте пытаетесь? Номера строк назовите. Я лично никаких попыток что-то найти в коде не вижу.

genia1991 пишет:

но ничего не работает.

Так, а с чего ему работать, если Вы ничего не делаете. Поиск, которого в программе нет, не может работать. Или у Вас другое мнение по этому вопросу?

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

не нужен string

замените это

char val=myFile.read();             
    if (val =="second")         

на это 

if ('s' == myFile.read() && 'e' == myFile.read() && 'c' == myFile.read() && 'o' == myFile.read() && 'n' == myFile.read() && 'd' == myFile.read())
{
 Serial.println("FOUND");
}

:))

 

genia1991
Offline
Зарегистрирован: 25.12.2019

sadman41 пишет:

Вы в первый класс ходили? Учили Вас там искусству чтения слов по-буквам? Вот научите теперь МК тому же самому.

а насколько сложно это сделать?

к сожалению совсем нет идей (

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

baby_in_Arduino пишет:

не нужен string

замените это

char val=myFile.read();             
    if (val =="second")         

на это 

if ('s' == myFile.read() && 'e' == myFile.read() && 'c' == myFile.read() && 'o' == myFile.read() && 'n' == myFile.read() && 'd' == myFile.read())
{
 Serial.println("FOUND");
}

:))

Чего троллить-то парня? У него и так нихрена не получается.

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

а вообще наверно каждый новичок должен пройти через боль прежде чем начать что то писать)

genia1991
Offline
Зарегистрирован: 25.12.2019

baby_in_Arduino пишет:

не нужен string

замените это

char val=myFile.read();             
    if (val =="second")         

на это 

if ('s' == myFile.read() && 'e' == myFile.read() && 'c' == myFile.read() && 'o' == myFile.read() && 'n' == myFile.read() && 'd' == myFile.read())
{
 Serial.println("FOUND");
}

:))

 

Спасибо но немного не подходит такая запись (

у меня есть переменная:

String val = "second";

и ее надо найти в txt файлике (узнать номер строки )

 

очень нужна помощь. пожалуйста помогите написать не сложный код

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

genia1991 пишет:

очень нужна помощь. пожалуйста помогите написать не сложный код

Так начинай, а мы поможем. Раз код несложный - значит, разберёшься потихоньку. Не надо канючить, надо учиться. Не хочешь учиться - в платный раздел форума.

genia1991
Offline
Зарегистрирован: 25.12.2019
 while (myFile.available()){
      
   char c = myFile.read();

          //store characters to string
          readString += c;  
}
    Serial.println(readString);                      // for debug

if (readString.indexOf("second")>0) {               // if I find the word "second"

Serial.println("FOUND");

эту конструкцию добавлю в часть кода где происходит считывание только 1 строчки. а не всего файла целиком. сейчас проверить нет возможности его. Смогу или вечером или на выходных.

Учиться хочу . просто для себя делаю как хобби

b707
Offline
Зарегистрирован: 26.05.2017

baby_in_Arduino пишет:
а вообще наверно каждый новичок должен пройти через боль прежде чем начать что то писать)

и для этого вы советуете новичку заведомо нерабочий код?

b707
Offline
Зарегистрирован: 26.05.2017

genia1991 пишет:

Учиться хочу . просто для себя делаю как хобби

тем более. Раз это хобби - значит никакой спешки нет. сидите и учитесь потихоньку.

genia1991
Offline
Зарегистрирован: 25.12.2019

b707 пишет:

genia1991 пишет:

Учиться хочу . просто для себя делаю как хобби

тем более. Раз это хобби - значит никакой спешки нет. сидите и учитесь потихоньку.

да так и пытаюсь когда время есть учусь.

Посмотрите на последний код . насколько он годится?  может что то улучшить можно

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

2b707
как не рабочий то?)

rkit
Offline
Зарегистрирован: 23.11.2016
boolean find(FILE & f, char * string_in) {
	auto len = strlen(string_in);
	while(f.avaliable() >= len) {
		auto pos = string_in;
		while(*pos++ == f.read()) {
			if (*pos == 0) return true;
		}
	}
	return false;
}

Не проверял. Код для ознакомления с принципом и самостоятельной проработки.

genia1991
Offline
Зарегистрирован: 25.12.2019

rkit пишет:

boolean find(FILE & f, char * string_in) {
	auto len = strlen(string_in);
	while(f.avaliable() >= len) {
		auto pos = string_in;
		while(*pos++ == f.read()) {
			if (*pos == 0) return true;
		}
	}
	return false;
}

Не проверял. Код для ознакомления с принципом и самостоятельной проработки.

это код который считывает определенную длину txt файла?

у меня есть док который читает строку до "\n" знака.

а тот что я написал не годится совсем ?   ))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

baby_in_Arduino пишет:
2b707 как не рабочий то?)
Если честно, то я подумал, что Вы так троллите. А Вы ... и впрямь считаете тот код рабочим?

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

2ЕвгенийП
а что в нем не рабочего?)
если в начале файла слово second то мы пришли к успеху)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Перечитайте сами, что Вы написали

genia1991 пишет:

эту конструкцию добавлю в часть кода где происходит считывание только 1 строчки. а не всего файла целиком. сейчас проверить нет возможности его. Смогу или вечером или на выходных.

Давайте с скажу это другими словами.

"Ну, чёта я тут накропал, проверять некогда, я человек занятой. Это Вам делать нехрен, вот и проверяйте за меня".

Вам это не кажется хамством?

Некогда проверять, потерпите до "вечера или выходных". Но хамить-то зачем?

rkit
Offline
Зарегистрирован: 23.11.2016

rkit пишет:

boolean find(FILE & f, char * string_in) {
	auto len = strlen(string_in);
	while(f.avaliable() >= len) {
		auto pos = string_in;
		while(*pos++ == f.read()) {
			if (*pos == 0) return true;
		}
	}
	return false;
}

Не проверял. Код для ознакомления с принципом и самостоятельной проработки.

Пересмотрел. Есть важная недоработка. Решается одной строчкой.

b707
Offline
Зарегистрирован: 26.05.2017

baby_in_Arduino пишет:
2ЕвгенийП а что в нем не рабочего?) если в начале файла слово second то мы пришли к успеху)

а если не в начале?

Достаточно одного пробела перед second, чтобы этот код ничего не нашел

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

2b707
ну так и было расчитано это ж очевидно) я потроллить ТСа написал и дать ему пищу для размышлений а не полностью поиск во всем файле)

genia1991
Offline
Зарегистрирован: 25.12.2019

ЕвгенийП пишет:

Перечитайте сами, что Вы написали

genia1991 пишет:

эту конструкцию добавлю в часть кода где происходит считывание только 1 строчки. а не всего файла целиком. сейчас проверить нет возможности его. Смогу или вечером или на выходных.

Это Вам делать нехрен, вот и проверяйте за меня".

если смотреть что некоторые заходят только тролить сюда. наверное так оно и есть. Я и другие читал темы

я выложил код здесь есть люди которые лучше разбираются. ничего не стоит глянуть и сказать можно ли исправить что то

genia1991
Offline
Зарегистрирован: 25.12.2019

baby_in_Arduino пишет:
2ЕвгенийП а что в нем не рабочего?) если в начале файла слово second то мы пришли к успеху)

тот код что в первом послу?

пускай ищет первое слово только )

но в нем же ошибка с SD считывается символами и сравнивается с char у которого уже не символ а слово.

Я так понял что работать этот код не должен?  или будет как то работать? ))

b707
Offline
Зарегистрирован: 26.05.2017

genia1991 пишет:

тот код что в первом послу?

расслабтесь, речь не про ваш код, ваш код не будет работать никогда.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

расслабтесь, речь не про ваш код, ваш код не будет работать никогда.

Оптимистичненько. :) 

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

genia1991
вы же в #9 вполне рабочий код нацарапали))

b707
Offline
Зарегистрирован: 26.05.2017

genia1991 пишет:

я выложил код здесь есть люди которые лучше разбираются. ничего не стоит глянуть и сказать можно ли исправить что то

никто не станет разбираться в вашем коде, пока вы его сами не проверили и не сказали, работает он или нет.

А когда вы демонстрируете, что вам проще тыщу вопросов задать, чем написать самому пару строк - и подавно.

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

b707 пишет:

расслабтесь, речь не про ваш код, ваш код не будет работать никогда.

Оптимистичненько. :) 

не надо обобщать :) я про конкретный код в конкретном случае, а не про способности ТС в целом :))))))))))))

Logik
Offline
Зарегистрирован: 05.08.2014

Код  baby_in_Arduino не рабочий. Но иногда он таки даст результат верный, тем он и особо противен. В топку его!

genia1991
Offline
Зарегистрирован: 25.12.2019

baby_in_Arduino пишет:
genia1991 вы же в #9 вполне рабочий код нацарапали))

поэтому и выложил что бы оценили. что бы глянули и сказали что то.

а почему вполне?  рабочий но не рабочий? :)

я его попробую разместить в ту часть кода где считывается только 1 строка а весь файл целиком.

Надеюсь что то заработает

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

2Logik
)) по второму кругу

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

Код  baby_in_Arduino не рабочий. Но иногда он таки даст результат верный

можно даже точно оценить, насколько "иногда" он будет работать - примерно в 16.66% случаев :)

genia1991
Offline
Зарегистрирован: 25.12.2019

забыл еще дописать. задача находить только первое слово в строке )

я протестю тогда уже потом напишу что получается. вечером

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

я про конкретный код в конкретном случае

С таким подходом к делу, который демонстрирует ТС, можно и обобщить.

b707
Offline
Зарегистрирован: 26.05.2017

baby_in_Arduino пишет:
2Logik )) по второму кругу

скажите честно - думали написать рабочий код. а когда не вышло - косите под "тролинг" ? :)

genia1991
Offline
Зарегистрирован: 25.12.2019

b707 пишет:

Logik пишет:

Код  baby_in_Arduino не рабочий. Но иногда он таки даст результат верный

можно даже точно оценить, насколько "иногда" он будет работать - примерно в 16.66% случаев :)

так а почему так?

b707
Offline
Зарегистрирован: 26.05.2017

genia1991 пишет:

так а почему так?

Геня, второй раз говорю - расслабтесь, речь не о вас и не о вашем коде.

genia1991
Offline
Зарегистрирован: 25.12.2019

b707 пишет:

genia1991 пишет:

так а почему так?

Геня, второй раз говорю - расслабтесь, речь не о вас и не о вашем коде.

ну ок )

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

2b707
не взлетел код, приходится теперь косить)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Навскидку, даже не компилировал, чисто принцип. Без всяких оптимизаций, простым языком, чтобы было совсем понятно:

bool find(File& f, const String& toFind, int& resultLineNumber)
{
	resultLineNumber = 0;

	size_t len = toFind.length(); // длина строки для поиска


	if(!len || len > f.size() - f.position()) // если строка пустая, или не помещается в файл с текущей позиции чтения - её найти невозможно
	{
		return false;
	}

	const char* str = toFind.c_str(); // указатель на строку, которую ищем

	while(f.available()) // пока есть байты к чтению
	{
		char ch = (char) f.read(); // читаем очередной символ из файла

		if(ch == '\n') // если это перевод строки - увеличиваем счётчик строк
		{
			resultLineNumber++;
		}
		else if(ch == *str) // если символ равен первому символу искомой строки, то
		{
			str++; // перемещаемся на следующий символ искомой строки

			while(f.available()) // пока можно читать
			{
				ch = (char) f.read(); // читаем следующий символ

				if(ch == '\n') // если это перевод строки, то
				{
					resultLineNumber++; // увеличиваем счетчик строк
					str = toFind.c_str(); // сбрасываем поиск в начало (если искомая строка не может быть разбита на части переводом строки)
					break; // выходим из подцикла
				}
				else if(ch == *str) // если прочитанный символ и текущий символ подстроки совпали, то
				{
					str++; // перемащаемся на следующий символ строки

					if(!*str) // если прочитали все символы, то строка найдена
					{
						return true;
					}
				}
				else // при несовпадении символов - сбрасываем указатель поиска на начало искомой строки
				{
					str = toFind.c_str();
					break;
				}
			}
		}
	}
	
	return false;
		
}

void setup()
{
	File f = SD.open(...);

	int line;
	String needle = F("needle");

	if(find(f,needle,line))
	{
		// found needle at "line" line
	}

	f.close();
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Более оптимальные, быстродействующие, продвинутые методы поиска - считаю, не для этого раздела, но всё же подскажу: они существуют, есть готовые реализации, стоит только поискать в гугле.

genia1991
Offline
Зарегистрирован: 25.12.2019

DIYMan пишет:

Более оптимальные, быстродействующие, продвинутые методы поиска - считаю, не для этого раздела, но всё же подскажу: они существуют, есть готовые реализации, стоит только поискать в гугле.

спасибо я попробую позже откомпилировать.

а где там переменная которую искать будет?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

genia1991 пишет:

а где там переменная которую искать будет?

А если ВНИМАТЕЛЬНО посмотреть - там разве не приведён пример использования?

genia1991
Offline
Зарегистрирован: 25.12.2019

DIYMan пишет:

genia1991 пишет:

а где там переменная которую искать будет?

А если ВНИМАТЕЛЬНО посмотреть - там разве не приведён пример использования?

String needle = F("second");     // НАШЕЛ ЭТУ СТРОЧКУ     

	if(find(f,needle,line))     ???????????????
	{
		serial . write("FOUND");
	}

if не совсем понял что это такое?

если нашло слово то ... например serial . write("FOUND");

Logik
Offline
Зарегистрирован: 05.08.2014

Принцип похож на правду, но используется стринг... А продвинутые - существуют конечно, например см  http://arduino.ru/forum/apparatnye-voprosy/gsm-modem-a6-v-rezhime-tcp , там поиск не в файле, а в потоке данных с модема. Но без разницы для любого потока одинаково, сам поиск в ProcessAT, в неё посимвольно передаются данные. Второй параметр - массив с искомыми словами и указателями функций, вызываемыми при нахождении.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

genia1991 пишет:

if не совсем понял что это такое?

Тогда вам прямая дорога к: взять и начать читать учебник по С++. Более я вам не помощник.

genia1991
Offline
Зарегистрирован: 25.12.2019

DIYMan пишет:

genia1991 пишет:

if не совсем понял что это такое?

Тогда вам прямая дорога к: взять и начать читать учебник по С++. Более я вам не помощник.

условие которое выполняется если слово найдено?

genia1991
Offline
Зарегистрирован: 25.12.2019

Logik пишет:

Принцип похож на правду, но используется стринг... А продвинутые - существуют конечно, например см  http://arduino.ru/forum/apparatnye-voprosy/gsm-modem-a6-v-rezhime-tcp , там поиск не в файле, а в потоке данных с модема. Но без разницы для любого потока одинаково, сам поиск в ProcessAT, в неё посимвольно передаются данные. Второй параметр - массив с искомыми словами и указателями функций, вызываемыми при нахождении.

спасибо. это сложно очень. предыдущий код буду разбирать как работает )

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

genia1991 пишет:

условие которое выполняется если слово найдено?

Давайте не будем играть в "угадай мелодию", ок? Вы читать основы С++ собираетесь? Если да - начинайте, и глупые вопросы отпадут уже после прочтения нескольких глав. Если нет, то, повторюсь - более я вам не помощник.

genia1991
Offline
Зарегистрирован: 25.12.2019

я проверил свой скетч 9 пост. вроде идеально работает )

мин 10 тестил никаких глюков пока не заметил. Тестил без основного кода. так что поиск этот еще надо будет прицепить на клавиатуру.

но отдельно код заработал.

кто  тут писал что работать не будет? :)

 

дальше задача будет на 32 кнопки повесить буквы. считывать в string .выводить на экран и использовать поисковый скетч этот.

есть еще над чем мозг поломать )