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

Здравствуйте! Из названия темы понятно, возможно ли вообще редактирование?
Пока склоняюсь к считыванию содержимого в переменную, далее редактирование значения внутри переменной, далее удаляем файл, создаем новый с этим же именем, записываем значение переменной обратно в файл. Возможны ли другие варианты?
Спасибо!

Нет, нету

Не нужно. Записывай в старый. в чем проблема.

Поподробнее, пожалуйста, есть метод удаления содержимого файла целиком, или редактирование отдельного слова например в *.txt?

Открой документацию на работу с сд да прочитай. Я не буду тебе ее сюда перепечатывать.

В том то и дело что читал, и в классе File нет методов удаления содержимого файла, и уж тем более для редактирования.

Никто не говорит о редактировании в файле, речь о перезаписи файла новым с тем же именем

Интересно, как же у тебя данные в файле оказались, если нет методов редактирования файла.

Пока в ручную, с пк, но нужна автономность, все настройки в файл на microSD.

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

С дописыванием проблем нет, а вот с редактированием…

@Soyer , сформулируйте задачу конкретнее.
Есть масса вариантов, и для каждого, как правило, более одного способа.
Среди способов есть:

  • редактировать на месте,
  • создавать новый файл и переписывать туда все содержимое старого,
  • перезаписывать только конец файла.

а зачем что-то удалять? Пиши поверх и все

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

В том то и дело, что есть сложность в замене нужной записи. Изначально хочу использовать структуру INI файла, получение значений исходя из секций и ключей не представляет сложности, для этого есть замечательная библиотека IniFile.h, могу создать файл в нужной директории и создавать секции, ключи и значения, но в конце документа, а вот изменять эти значения - сложность. Это на С++ есть API для работы с файлами этого типа, для ардуино без костылей не обойтись.
Не совсем понятно то что Вы описали, допустим я нашел начало строки которую необходимо заменить, дальше по сути необходимо заменить значение, для этого нужно выделить это значение исходя из длины записи и вставить новое, но как это сделать?

госспади, ну прими ты как допущение, что строка не может быть больше 64/128/256 символов ASCII. Тогда у тебя весь файл будет рассматриваться как база данных строк. Так как длина строки фиксирована, ты всегда можешь вычислить в каком секторе файла лежит N-ная строка. Читаешь ее в буфер, правишь и пишешь взат на то же место, не надо ничо ни удалять, ни переписывать (при удалении и вставке надо, но речь была за редактирование);

1 лайк

Я слушаю…

Не вынес таки, слабак! Я тоже сперва подумал написать что-то гневно-обичительное, но решил, что читать - смешнее.

1 лайк

А хуже формат для 8 бит не смог придумать?

2 лайка

предложили такой алгоритм: создается temp.ini, в него построчно копируются через строковую переменную все данные, попутно в этой переменной производится сравнение секции и ключа исходя из заданных аргументов функции (section,key,newvalue), если совпало, то редактируется значение ключа. затем оригинальный файл удаляется, а на его место перемещается temp.ini, но уже с именем оригинального файла. Но есть проблемы - отсутствие метода printf в классе SDLib::File (компилятор ругается: ‘class SDLib::File’ has no member named ‘printf’; did you mean ‘print’?), и второе это отсутствует функция SD.rename в SDLib::SDClass (‘class SDLib::SDClass’ has no member named ‘rename’; did you mean ‘remove’?). Есть ли возможности обхода данных ошибок? (код ниже)

// the function was developed by
    //Alisher Rakhimov raximhon.ali@gmail.com
    bool editValue(const char *section_name, const char *key_name, const char *new_value) {
      if (_FileName == "") {
        return -1;
      }
      _File = SD.open(_FileName, FILE_READ);
      if (!_File)
        return -1;
      File temp_file = SD.open("temp.ini", FILE_WRITE);
      if (!temp_file) {
        _File.close();
        return -1;
      }
      bool section_found = false;
      while (_File.available()) {
        String line = _File.readStringUntil('\n');
        if (line.startsWith("[") && line.endsWith("]\n") && line.substring(1, line.length() - 2) == section_name) {
          section_found = true;
        }
        if (section_found && line.startsWith(key_name)) {
          temp_file.printf("%s=%s\n", key_name, new_value); // тут ошибка
        } else {
          temp_file.print(line);
        }
      }
      _File.close();
      temp_file.close();
      if (SD.remove(_FileName) && SD.rename("temp.ini", _FileName)) {  // тут ошибка
        return 0;
      } else {
        return -1;
      }
    }

вообщем вопрос с

temp_file.printf("%s=%s\n", key_name, new_value);

решился с помощью трех строчек print
второй вопрос остался, поможите, люди добрые! в интернете вообще информации по переименованию с перемещением мало, а если и есть, то предлагают использовать библиотеки SdFat2.h и SdFat.h