Здравствуйте! Из названия темы понятно, возможно ли вообще редактирование?
Пока склоняюсь к считыванию содержимого в переменную, далее редактирование значения внутри переменной, далее удаляем файл, создаем новый с этим же именем, записываем значение переменной обратно в файл. Возможны ли другие варианты?
Спасибо!
Нет, нету
Не нужно. Записывай в старый. в чем проблема.
Поподробнее, пожалуйста, есть метод удаления содержимого файла целиком, или редактирование отдельного слова например в *.txt?
Открой документацию на работу с сд да прочитай. Я не буду тебе ее сюда перепечатывать.
В том то и дело что читал, и в классе File нет методов удаления содержимого файла, и уж тем более для редактирования.
Никто не говорит о редактировании в файле, речь о перезаписи файла новым с тем же именем
Интересно, как же у тебя данные в файле оказались, если нет методов редактирования файла.
Пока в ручную, с пк, но нужна автономность, все настройки в файл на microSD.
Давно было, но точно помню, что не переписывал, а просто дописывал в *.txt файл на флешке (16 гиг). Если бы начал что то переписывать, то памяти точно не хватило бы. Попробуй флешку использовать в режиме диска ftp сервера, может так легче будет на неё записывать.
С дописыванием проблем нет, а вот с редактированием…
@Soyer , сформулируйте задачу конкретнее.
Есть масса вариантов, и для каждого, как правило, более одного способа.
Среди способов есть:
- редактировать на месте,
- создавать новый файл и переписывать туда все содержимое старого,
- перезаписывать только конец файла.
а зачем что-то удалять? Пиши поверх и все
Форматируй под свои задачи флешку. Ставь метку начала записи. И если записи имеют одинаковую длину, то просто считай метки и пиши поверх в то место где была старая запись (как было уже сказано).
В том то и дело, что есть сложность в замене нужной записи. Изначально хочу использовать структуру INI файла, получение значений исходя из секций и ключей не представляет сложности, для этого есть замечательная библиотека IniFile.h, могу создать файл в нужной директории и создавать секции, ключи и значения, но в конце документа, а вот изменять эти значения - сложность. Это на С++ есть API для работы с файлами этого типа, для ардуино без костылей не обойтись.
Не совсем понятно то что Вы описали, допустим я нашел начало строки которую необходимо заменить, дальше по сути необходимо заменить значение, для этого нужно выделить это значение исходя из длины записи и вставить новое, но как это сделать?
госспади, ну прими ты как допущение, что строка не может быть больше 64/128/256 символов ASCII. Тогда у тебя весь файл будет рассматриваться как база данных строк. Так как длина строки фиксирована, ты всегда можешь вычислить в каком секторе файла лежит N-ная строка. Читаешь ее в буфер, правишь и пишешь взат на то же место, не надо ничо ни удалять, ни переписывать (при удалении и вставке надо, но речь была за редактирование);
Я слушаю…
Не вынес таки, слабак! Я тоже сперва подумал написать что-то гневно-обичительное, но решил, что читать - смешнее.
А хуже формат для 8 бит не смог придумать?
предложили такой алгоритм: создается 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