Редактирование файла на microSD

Так все-таки что вы редактируете - ключ или значение??

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

значение ключа

вот, это мне и нужно было знать.

это бессмыслица
ваши строки имеют формат
“ключ = значение”
например
“цвет = красный”. Цвет это ключ, значение это красный.
Покажите мне в этой строке, где у вас “значение ключа” ?

Я же писал редактируется значение SSID
Изначально значение TTK-19, после изменения TTK-191

Сорри, не хочу ругаться, но такое впечатление что вы крепко выпили и плохо воспринимаете что вам говорят.

Короче, я пока воздержусь от комментариев.
Советую вам, для начала, внимательно еще раз перечитать всю ветку. Там было много полезных советов, например сообщение 53

Нет . \r = 13 \n = 10. Виндовую ересь, к тому же древнюю и уже не актуальную тащить с собой по жизни не нужно! ;))

Еще раз, для запоминания!

\r == 13: \n == 10

Почему “нет” ?
обычно я стараюсь не связываться, но все же - разве я написал не то же самое? :slight_smile:

Ты, мне показалось, написал, что \r и \n одно и тоже. Если я в попыхах перепутал, прости. Вроде теперь я не вижу этого…
Сорри, короче.

не, я написал что 0xD и 13 одно и тоже :slight_smile:

“знать” нужно таблицу умножения. А подобные вещи нужно выводить логически. Знание тут ни при чем - нужно лишь умение логически мыслить.

Вот так все работает, формат сохраняется, не требует замены всего что ниже заменяемого значения, оставляю здесь, может кому понадобиться:

    int editValue(const char *section_name, const char *key_name, const char *new_value) {
      if (_FileName == "")
        return 1;
      _File = SD.open(_FileName, O_RDWR);
      if (!_File)
        return -1;
      byte buff_size = 80;
      char buffer[buff_size];
      int buffer_pos = 0;
      bool section_found = false;
      int ct_smvl = 0;
      while (_File.available()) {
        char c = _File.read();
        if (c == '\r') {
          continue;
        }
        buffer[buffer_pos++] = c;
        if (c == '\n' || buffer_pos == buff_size - 1) {
          buffer[buffer_pos] = '\0';
          if (buffer[0] == '[' && buffer[buffer_pos - 2] == ']' &&
              strncmp(buffer + 1, section_name, buffer_pos - 3) == 0) {
            section_found = true;
          }
          if (section_found && strncmp(buffer, key_name, strlen(key_name)) == 0) {
            //snprintf(buffer, buff_size, "%s=%s", key_name, new_value);
            int t_ct_smvl = ct_smvl - strcspn(buffer, "="); //
            buffer_pos = (strlen(new_value));
            char buff[strlen(new_value)+2];
            strcpy(buff, new_value);
            strcat(buff,"\r\n");
            _File.seek(t_ct_smvl);
             _File.write(buff, sizeof(buff));
            _File.seek(ct_smvl);
            _File.close();
            return 0;
          }
          buffer_pos = 0;
        }
        ct_smvl++;
      }
      _File.close();
      return 2;
    }

и получение значения:

String getValue(const char* section, const char* key) {
      bool section_found = false;
      if (_FileName == "") {
        err = -1;
        return "";
      }
      _File = SD.open(_FileName, FILE_READ);
      if (!_File) {
        err = -1;
        return "";
      }
      byte buff_size = 80;
      char buffer[buff_size];
      int buffer_pos = 0;
      while (_File.available()) {
        char c = _File.read();
        if (c == '\r') {
          continue;
        }
        buffer[buffer_pos++] = c;
        if (c == '\n' || buffer_pos == buff_size - 1) {
          buffer[buffer_pos] = '\0';
          if (buffer[0] == '[' && buffer[buffer_pos - 2] == ']' &&
              strncmp(buffer + 1, section, buffer_pos - 3) == 0) {
            section_found = true;
          }
          if (section_found && strncmp(buffer, key, strlen(key)) == 0) {
            buffer_pos = strlen((strstr(buffer, "=") + 1)) - 1;
            char buff[buffer_pos];
            strcpy(buff, strstr(buffer, "=") + 1);
            _File.close();
            String retv = buff;
            retv.replace("\n", "");
            return retv;
          }
          buffer_pos = 0;
        }
      }
      _File.close();
      err = 1;
      return "";
    }

Хотел было спросить, как вы научились добавлять более длинную строку, не переписывая остального, но глянул в код…

Дальше вот этого и смотреть не стал. Если вы не видите здесь кучи грубейших ошибок - вы ничего не понимаете в программировании.

 ...
      int buffer_pos = 0;
      bool section_found = false;
      int ct_smvl = 0;
      while (_File.available()) {
        char c = _File.read();
        if (c == '\r') {
          continue;
        }
        buffer[buffer_pos++] = c;
        if (c == '\n' || buffer_pos == buff_size - 1) {
          buffer[buffer_pos] = '\0';

Этот код в принципе работать не может.

но он работает

Не работает, не обманывайте себя.

Ок. добавил номера строк.
Ответьте мне, что происходит в строке 10? (по моему коду, по вашему коду это строка 20)

что за вопросы,? добавляем в буфер полученное от _File.read(); значение, при этом инкрементируем buffer_pos

глаза не обманывают
до редактирования:

[SECRET]
#сетевые параметры
SSID=TTK-19
PASS=294007851

после:

[SECRET]
#сетевые параметры
SSID=TTK-191
PASS=294007851

нет.
Вы добавляете в буфер какое-то неведомое значение, определенное где-то ранее. К символу, считанному из _File.read(); -оно не имеет ни малейшего отношения.

зачем? Опять же ваш buffer_pos не имеет ни малейшего отношения к длине буфера. Как вы его выставили равным нулю в строке 2 (по моему коду), так оно ноль и остается до строки 10.

Вы совсем что ли код читать не умеете? У вас полная белиберда написана.
И не надо мне показывать якобы исправленный файл. Варианта только два - либо вы просто нагло врете, либо это не тот код, которым вы правите файл.

char c = _File.read();

ИМХО код рабочий !