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

Проблемы Вы выдумываете сами себе.
Перечитайте еще раз сообщение №18.
Если с первого раза не дойдет, перечитывайте до полного просветления.
Если все равно непонятно, переформулирую сообщение rkit’а: Вы допустили ошибку на этапе проектирования. Теперь нужно не искать заплатки для того, чтобы закамуфлировать эту ошибку, а просто перепроектировать программу, чтобы этой ошибке изначально не было места.

А сами то Вы как думаете? Есть или нет?

Добавьте методы printf и rename в класс. Ну, или обходитесь без них. Делов-то.

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

На старом форуме были примеры и того, и другого.

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

не пойму где какая ошибка, мне необходимо менять значения ключа для того, чтобы изменять настройки устройства. все пишут, что откажись от ini файла, да даже если откажусь, проблема никуда не уйдет, так или иначе нужно будет искать возможность изменения файла с настройками, будь то хоть обычный txt файл. строку в буфер прочитать (пример выше), изменить значение в буфере также никаких проблем не составляет, а вот заменить строку отредактированным значением не хватает мозгов, и поиск не помогает.

Вы идиот или как? Вам уже пять раз написали, как делать - находите нужную строку в файле и записываете поверх нее новую.
Нафига для этого переписывать весь файл?
А если файл будет 100килобайт, а поменять надо один символ - вы тоже будете все 100К переписывать?
Голова должна быть или нет?
Заодно и вторая проблема отпадет - файл переименовывать не придется.

Можно стандартный вывод в твой SDLib::File переназначить. fdevopen(…) поможет знающему. На крайняк sprintf(…). Нада больше читать.

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

int rename(const char *section_name, const char *key_name, const char *new_value) {
      bool end_line = false;
      if (_FileName == "")
        return -1;
      _File = SD.open(_FileName, FILE_READ);
      if (!_File)
        return -1;
      int i = _File.available();
      String line; char smvl;
      bool section_found = false, key_found = false;
      for (int a = 0 ; a <= i; a++) {
        _File.seek(a);
        smvl = _File.peek();
        end_line = (smvl == '\n' || smvl == -1 ) ? true : false;
        if (!end_line)
          line += smvl;
        else {
          if (line.startsWith("[") && line.endsWith("]" + line.substring(line.length() - 1)) && line.substring(1, line.length() - 2) == section_name) { // + line.substring(line.length()-1)),2)
            section_found = true;
          if (section_found && line.startsWith(key_name)) {
            int startline = a - line.length();
            line = String(key_name) + '=' + String(new_value) + '\n';
            byte buff[line.length()];
            line.toCharArray(buff, sizeof(buff));
            _File.close();
            //СТРОКА НИЖЕ ЗАПИСЫВАЕТ НА ТОЖЕ МЕСТО
            _File = SD.open(_FileName, O_RDWR);
            if (!_File)
              break;
            key_found = true;
            _File.seek(startline);
            _File.write(buff, sizeof(buff));
            break;
          } else key_found = false;
          line = "";
        }
      }
      _File.close();
      if (key_found) {
        return 1;
      } else {
        return 0;
      }
    }

Не понял, что имеется в виду.
Конечно, при методе замены новая строка должна иметь точно такую же длину, как и прежняя

ключ со значением находящийся ниже изменяемой строки образуют одну строку, т.е. символ переноса каретки (‘\n’) почему то не работает

line = String(key_name) + '=' + String(new_value) + '\n';

нет такого символа “переноса каретки”. Есть “возврат каретки” CR и есть “перевод строки” LF. Вам какой нужен?

Скорее LF наверное, эквивалент ‘\n’

попробуйте вместо ‘\n’ подставить char(10)

попробую, вот этот работает “\0”

только это совсем не ‘\n’

в этом то и странность

еще бы разобраться что возвращает эта строка, без нее line.endsWith(“]”) не работает, все другие варианты с подстановкой line.endsWith(“]\n”), или line.endsWith(“]\r”) и line.endsWith(“]\0”) так же не работают. Что то стоит после закрывающей квадратной скобки, а что стоит хрен знает. если в комп флешку вставить, то никаких доп символов не показывает. Что это может быть?

https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/substring/

Вы меня не поняли, я прекрасно знаю что это за функция, ведь я эту строчку и прописал, не понятно что она возвращает (через SerialPrint не отлавливается символ), как бы отловить и избавиться от лишнего кода?

попробуйте

char a = line.substring(line.length() - 1).charAt(0);
Serial.print(a, HEX);