Так все-таки что вы редактируете - ключ или значение??
И если новая строка длиннее старой - редактирование на месте невозможно, надо переписывать весь файл или по крайней мере часть от места редактирования и до конца.
Так все-таки что вы редактируете - ключ или значение??
И если новая строка длиннее старой - редактирование на месте невозможно, надо переписывать весь файл или по крайней мере часть от места редактирования и до конца.
значение ключа
вот, это мне и нужно было знать.
это бессмыслица
ваши строки имеют формат
“ключ = значение”
например
“цвет = красный”. Цвет это ключ, значение это красный.
Покажите мне в этой строке, где у вас “значение ключа” ?
Я же писал редактируется значение SSID
Изначально значение TTK-19, после изменения TTK-191
Сорри, не хочу ругаться, но такое впечатление что вы крепко выпили и плохо воспринимаете что вам говорят.
Короче, я пока воздержусь от комментариев.
Советую вам, для начала, внимательно еще раз перечитать всю ветку. Там было много полезных советов, например сообщение 53
Нет . \r = 13 \n = 10. Виндовую ересь, к тому же древнюю и уже не актуальную тащить с собой по жизни не нужно! ;))
Еще раз, для запоминания!
Почему “нет” ?
обычно я стараюсь не связываться, но все же - разве я написал не то же самое?
Ты, мне показалось, написал, что \r и \n одно и тоже. Если я в попыхах перепутал, прости. Вроде теперь я не вижу этого…
Сорри, короче.
не, я написал что 0xD и 13 одно и тоже
“знать” нужно таблицу умножения. А подобные вещи нужно выводить логически. Знание тут ни при чем - нужно лишь умение логически мыслить.
Вот так все работает, формат сохраняется, не требует замены всего что ниже заменяемого значения, оставляю здесь, может кому понадобиться:
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();
ИМХО код рабочий !